java初心者です。
テキストファイルを一行づつ読み込んで行く時に、
32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか?
while ((str = br.readLine()) != null) { // 1行ずつ読み込む
上記文の下に何かを配置するまではわかるのですが、
javaの日付チェックで調べてみても理解が足りず正解が出せずに困っております。
すみませんが、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
以下の checkDate ような、日付が有効かどうかをチェックするメソッドを作成し、判定してみてはいかがでしょうか。
lang
1import java.text.DateFormat; 2import java.text.ParseException; 3 4public class sample { 5 public static void main (String[] args) { 6 7 if (checkDate("2014/01/02")){ 8 System.out.println("日付です"); 9 } else { 10 System.out.println("日付ではありません"); 11 } 12 } 13 14 public static boolean checkDate(String strDate) { 15 if (strDate == null || strDate.length() != 10) { 16 return false; 17 } 18 DateFormat format = DateFormat.getDateInstance(); 19 format.setLenient(false); 20 try { 21 format.parse(strDate); 22 return true; 23 } catch (Exception e) { 24 return false; 25 } 26 } 27}
投稿2015/06/16 03:25
総合スコア159
0
試しに作ってみたので参考にでもしてみて下さい
java
1import java.io.*; 2import java.util.*; 3import java.nio.file.*; 4public class HT{ 5 6 7public static void main(String[] args){ 8 9 10try(BufferedReader br=new BufferedReader(new FileReader("C:\\file\\files\\t.txt"));){ 11 12String str=""; 13int fl3=0; 14 15while((str=br.readLine())!=null){ 16 17ArrayList<Character> i=new ArrayList<>(); 18for(int b=0;b<str.length();b++){ 19 20char g=str.charAt(b); 21 22int h=(int)g; 23 24if(48<=h && h<=57 && fl3==0){ 25i.add(g); 26 27fl3=1; 28}else if(48<=h && h<=57 && fl3==1){ 29i.add(g); 30 31}else if(fl3==1 && (h<48 || h>57)){ 32fl3=0; 33 34String j=str.substring(b,b+1); 35 36if(j.equals("日") || j.equals("月")|| j.equals("年")){ 37 38int y=1; 39int x=0; 40for(int o=i.size()-1;o>=0;o--){ 41 42int r=Character.getNumericValue(i.get(o)); 43x=x+r*y; 44 45y=y*10; 46} 47i=new ArrayList<Character>(); 48if(j.equals("日")){ 49if(x>31 || x<0){ 50System.out.println(x+"日"); 51throw new Exception();} 52} 53if(j.equals("月")){ 54if(x<0 || 12<x){ 55System.out.println(x+"月"); 56throw new Exception();} 57} 58if(j.equals("年")){ 59if(x<0){ 60System.out.println(x+"年"); 61 62throw new Exception();} 63} 64 65 66y=1; 67x=0; 68 69} 70 71 72 73} 74 75} 76 77 78 79} 80 81 82 83 84}catch(Exception e){ 85 86System.out.println("異常な数値が検出されました");} 87 88 89} 90 91 92}
投稿2016/11/01 00:03

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
初めまして。
CalendarやDateFormatのsetLenientを使用する方法を提案します。
lang
1try { 2 Calendar cal = Calendar.getInstance(); 3 cal.setLenient(false); 4 cal.set(year, month, day); 5 cal.getTime(); 6} catch (IllegalArgumentException e) { 7 // 日付が不正な場合の処理 8}
setLenientの引数にfalseを入れると厳密な日付チェックを行います。
日付がおかしければ例外をスローするのでこれを利用するのがいいかと思います。
投稿2015/06/16 15:50
総合スコア233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
正規表現を使うのはいかがでしょうか?
以下、思いつきなのですが、もし、読み込むファイルの各行に現れる日付は、必ず
日付:YYYY/MM/DD
という形式で行に出現するという前提があるとします。(あくまで仮定です。)
ここでYYYY、MM、DDは実際は半角の数字ですが、数字であっても、日付として
不正な数字の並びが入ってくる可能性がある場合に
(たとえば、"2015/6/31" など)正規表現、
String regex = "日付:([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})";
ぐらいの緩い制約でマッチさせて、3つのカッコのそれぞれで取得できる文字列を
整数に変換したうえで、
boolean isValidDate(int year, int month, int day )
のようなメソッドに渡し、もしこれが falseを返したときにこのメソッドを
使う側で何らかの例外を発生させるとよいと思います。
isValidDate メソッドでは年月日を構成する数値として正しいか
どうか、たとえば、month=6月である場合には、day=31はNGなど
の判定を行うように実装します。
参考になりましたら幸いです。
投稿2015/06/16 03:21
総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。