###前提・実現したいこと
[前提]TestクラスとHelloクラスが存在します。Testクラスを実行したところ何のエラーもなくプログラムを終了させることが出来たのですが、Testクラスに機能を付け足したHelloクラスではエラーが出ました。
コンソール入力した内容は次の4行からなる文字列です。
3
1.1.1.1
2.2.2.2
3.3.3.3
Testクラスは、入力された2~4行目の文字列を"."で区切って数値化し、それを出力するクラスです。
Helloクラスは、Testクラスに少し機能を追加したもので、「2~4行目の文字列がIPアドレスの形式になっているかどうか判断する」という目的をもつクラスです。
sg10,20,30 のsgは「作業(sagyou)」から名付けた変数です。コンソール入力1行目のnumberof変数は、あと何行文字列が入力されるかを示した数値です。
質問1.Testクラスについて .split(".") だと"."がメタ文字と判断されてしまったため"[.]"と記述したのですが、これは正しい判断でしょうか?
質問2.Testクラスについて "numberof"ではなく"numberof+1"としている箇所が3箇所存在します。これは、何故かsg10[0]に""が代入されてしまうためです。そのため、sg10→sg20への代入の際にsg10[0]は用いずにsg10[1]~を用いています。何故何も代入されない配列が生まれてしまうのでしょうか?初めはENTERキーが原因かとも思いましたが、クラスitumoで入力した文字列がきちんとline2として出力されることから、どうやらENTERキーが原因でも無いようです(?)。何故だ...
質問3.Helloクラスについて 下記のエラーを吐かれました。sg20[2]0→sg30[2]0への変換時にエラーが出たようです。Stringである"3"を .Integer.parseInt( ) を用いてintに変える作業自体はおかしな事ではあるませんよね?ですが何故かエラーが出ます。更に奇妙なのが、Helloクラスではエラーが出るのに、本質的に同じである筈のTestクラスではエラーが出ないのです!もしかしたら質問2と何らかの相関性があるのかもしれませんが、僕にはわかりませんでした。
追記 質問3をもう一度試してみたところ、今度は"3"ではなく"1"でエラーが出ました。もうわけがわかりません。
長々と失礼しました。どなたか、分かる方がいらっしゃればどうかご解答ください。
###発生している問題・エラーメッセージ
質問3.Exception in thread "main" java.lang.NumberFormatException: For input string: "3"
3 1.11.111.1111 2.22.222.2222 3.33.333.3333 Exception in thread "main" java.lang.NumberFormatException: For input string: "1" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at sample.Hello.main(Hello.java:19)
###該当のソースコード
Java
1package sample; 2 3import java.util.Scanner; 4 5public class Test { 6 7 public static void main(String[] args) { 8 Scanner sc = new Scanner(System.in); 9 int numberof = sc.nextInt(); 10 String[] sg10 = new String[numberof+1]; 11 String[][] sg20 = new String[numberof][]; 12 int[][] sg30 = new int[numberof][]; 13 for(int i=0; i<numberof+1; i++) sg10[i] = sc.nextLine(); 14 for(int i=0; i<numberof; i++){ 15 sg20[i] = sg10[i+1].split("[.]"); 16 sg30[i] = new int[sg20[i].length]; 17 for (int k=0; k<sg20[i].length; k++){ 18 if (!sg20[i][k].equals("") && !sg20[i][k].equals(null)){ 19 sg30[i][k] = Integer.parseInt(sg20[i][k]); 20 } 21 } 22 } 23 for (int i=0; i<numberof; i++) { 24 for(int k=0; k<sg20[i].length; k++){ 25 System.out.println("i="+i+" k="+k+" "+sg30[i][k]); 26 } 27 } 28 } 29} 30
Java
1package sample; 2 3import java.util.Scanner; 4 5public class Hello { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 int numberof = sc.nextInt(); 9 int[] check = new int[numberof]; 10 String[] sg10 = new String[numberof+1]; 11 String[][] sg20 = new String[numberof][]; 12 int[][] sg30 = new int[numberof][]; 13 for(int i=0; i<numberof+1; i++) sg10[i] = sc.nextLine(); 14 for(int i=0; i<numberof; i++){ 15 sg20[i] = sg10[i+1].split("[.]"); 16 sg30[i] = new int[sg20[i].length]; 17 for (int k=0; k<sg20[i].length; k++){ 18 if (!sg20[i][k].equals("") && !sg20[i][k].equals(null)){ 19 sg30[i][k] = Integer.parseInt(sg20[i][k]); 20 if (sg30[i][k]<0 || sg30[i][k]>255) check[i]=1; 21 }else check[i] =1; 22 23 } 24 } 25 for (int i=0; i<numberof; i++){ 26 if (check[i] == 0) System.out.println("True"); 27 else System.out.println("False"); 28 } 29 } 30} 31
Java
1package sample; 2 3import java.util.Scanner; 4 5public class itumo { 6 7 public static void main(String[] args) { 8 Scanner sc = new Scanner(System.in); 9 String line1 = sc.nextLine(); 10 String line2 = sc.nextLine(); 11 System.out.println("line1="+line1); 12 System.out.println("line2="+line2); 13 } 14}
java
1package sample; 2 3public class test2 { 4 5 public static void test2(String aaa) { 6 7 char[] iii = aaa.toCharArray(); 8 int[] uuu = new int[iii.length]; 9 for (int i=0; i<iii.length; i++){ 10 uuu[i] = iii[i]; 11 System.out.println(Integer.toHexString(uuu[i])); 12 } 13 14 15 16 } 17 18} 19
###補足情報(言語/FW/ツール等のバージョンなど)
javaです。eclipsを使っています。
###[追記]
swordoneさん 本当ですね コードが全く同じでも、正常に終了する場合とエラーが出る場合がありました(下記画像参照)
itumono(スクリーンショット どっとうpロダ)
Hello(スクリーンショット どっとうpロダ)
eclips Version: Neon.1a Release (4.6.1)
OS Windows 10 Home 64bit
を使っています。
###[追記]の[追記]
やっと、やっと解決しました。KSwordOfHaste さんに従ってtest2クラスを作り、文字コードに分解してみたところ、0xFEFF(BOM)が混入していました。どうやらBOMとはUTF-16や32などで採用されているZERO WIDTH NO-BREAK SPACE(幅の無い改行しない空白)なるものであり、何故itumoクラスではエラーが出ずにHelloクラスでエラーが出たのかと言うと、実行構成のエンコードが前者ではUTF-8であったのに対して後者ではUTF-16に設定されていたからでした。解答してくださったSwordoneさん、tetratailさん、KSwordOfHasteさん、本当にありがとうございました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/22 07:32