質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1034閲覧

適当な数字を入れた場合にエラー文に入らない

NIKONIKONIKONIK

総合スコア83

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/07/12 04:41

編集2019/07/12 05:01

適当な数字を入れた場合にエラーではなく ”4”という謎の数字が出力されてしまう

java

1 2import java.util.Scanner; 3public class Kadai1203 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 7 LoginManager logmana = new LoginManager(); 8 System.out.print("Select(LI:Login PU:PrintUser E:End)--> "); 9 String select = sc.next(); 10 while("E".equals(select) != true) { 11 if("LI".equals(select)) { 12 System.out.print("UserId --> "); 13 String userid = sc.next(); 14 System.out.print("Password --> "); 15 String pass = sc.next(); 16 User user = new User(userid,pass); 17 try { 18 logmana.login(user); 19 System.out.println("Login is Successful."); 20 } 21 catch(Exception e) { 22 System.out.println(e.getMessage()); 23 } 24 } 25 else if("PU".equals(select)) { 26 System.out.println("UserId : " + logmana.getLoginUser().getUserid()); 27 System.out.println("Password : " + logmana.getLoginUser().getPassword()); 28 } 29 System.out.println(); 30 System.out.print("Select(LI:Login PU:PrintUser E:End)--> "); 31 select = sc.next(); 32 } 33 } 34}

java

1public class User { 2 private String userid; //ユーザID 3 private String password; //パスワード 4 User(String userid,String password){ 5 this.userid = userid; 6 this.password = password; 7 } 8 String getUserid() { 9 return userid; 10 } 11 String getPassword() { 12 return password; 13 } 14}

java

1public class LoginManager { 2 private User loginUser = null;//ログイン中のユーザ 3 private User[] userList = { new User("user01","Denshi"), //登録済みユーザの配列 4 new User("user05","Qazwsx"), 5 new User("user12","PoiUytRewq"), 6 new User("user21","ZxcVbnm") 7 }; 8 User getLoginUser() { 9 return loginUser; 10 } 11 void login(User user) throws Exception { //引数で受け取ったユーザのIDの組み合わせが登録済みならログイン成功とし、ログイン中のユーザをセットする。登録済みでないときは、ログイン中のユーザををnullにして、("UserId or Password Error")のエラーメッセージをセットしたException例外をスローする 12 for(int i = 0;i <= userList.length;i++) { 13 if(userList[i].getUserid().equals(user.getUserid())) { 14 if(userList[i].getPassword().equals(user.getPassword())) { 15 loginUser = user; 16 break; 17 } 18 } 19 } 20 if(loginUser != user) { 21 throw new Exception("UserId or Password Error"); 22 } 23 } 24}

java

1Select(LI:Login PU:PrintUser E:End)--> LI 2UserId --> sss 3Password --> sss 44 //謎の数字 5Select(LI:Login PU:PrintUser E:End)-->

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/07/12 04:50

提示のコードはなにをするものなんでしょう んで、エラー分とはどこのことでしょう あまりにも説明不足です
m.ts10806

2019/07/12 04:51

コードブロックの冒頭はファイル名等ではなく言語名を入れてください。
m.ts10806

2019/07/12 04:58

えっと [Java] だけで良いです。
guest

回答3

0

ベストアンサー

表層的な原因

Java

// LoginManager
for(int i = 0;i <= userList.length;i++) {

userList[4]にアクセスしています。

潜在的な原因

Java

try {
logmana.login(user);
System.out.println("Login is Successful.");
}
catch(Exception e) {
System.out.println(e.getMessage());
}

Java

if(loginUser != user) {
throw new Exception("UserId or Password Error");
}

例外の型をExceptionにするのは広過ぎです。


なお、以前の質問でも同様の議論をしています。読み飛ばしたまま進めてはいませんか。

LouiS0616 2019/07/07 16:40

@katoy さん
Exceptionでキャッチする処理を例示するのはちょっとまずい気がします。
わざと改良の余地を残しているのでしたら、ごめんなさい。

katoy 2019/07/07 16:48

..Exceptionでキャッチする処理を例示するのはちょっとまずい気がします。 ...
はい、そのとうりです。
学校の課題の回答としても原点されるポイントです。
適切な Exception でcatch するように書き直したものを提出して欲しいとおもいますし、先生もそのことを説明して欲しいものです。

Java - 配列の添え字を変えずに再入力する方法がわかりません。|teratail

投稿2019/07/12 05:01

編集2019/07/12 05:05
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NIKONIKONIKONIK

2019/07/12 05:47

例えば 例外の型はどのようなやり方がありますでしょうか?
LouiS0616

2019/07/12 06:27

独自に例外クラスを作ってやるのが良いかと思います。 既存のものを使うのであれば、一番それっぽいのはIllegalArgumentExceptionあたりですかね。
guest

0

Louis0616さんの回答で十分かと。

デバッグ実行の方法は、わかりますでしょうか?

少なくともログインのあとにLogin is Successful.が表示されないなら
例外が発生したことがわかる(想定)できます。

で、Exceptionのところ

java

1System.out.println(e.getMessage());

が、実行されているだろうことがわかる(といいなぁ)
なので、ここでデバッガでExceptionの中身を確認すれば、意味不明の文字の正体がわかります。

そもそものcatchうんぬんもありますが、e.getMessageの中身は、今回みたように、ほぼ役に立たないメッセージです。
※自分で例外クラスを設計&生成するなら別ですが

なので、catchの中身を

java

1e.printStackTrace();

にすると、原因の特定が早くなると思います。

投稿2019/07/12 05:17

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列をスキャンするのに配列の index で for ループする代わりに 拡張 for をつかうとよいです。
for (User user : userList ) {

このことも含めて、全体をかきなおしてみました。
とくの password の処理を変更しています。
getPassword()で パスワードをアクセスできてしまうのはセキュリティ上の問題になる可能性があります。
パスワードに関する操作は、設定とチェックだけのとし, 取得はできないようにしました。

java

1package teratail; 2 3import java.util.Scanner; 4 5public class Kadai1203 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 9 LoginManager logmanager = new LoginManager(); 10 while (true) { 11 try { 12 System.out.print("Select(LI:Login PU:PrintUser E:End)--> "); 13 String select = sc.next(); 14 if ("E".equals(select)) { 15 break; 16 } else if ("LI".equals(select)) { 17 System.out.print("UserId --> "); 18 String userid = sc.next(); 19 System.out.print("Password --> "); 20 String pass = sc.next(); 21 logmanager.login(userid, pass); 22 System.out.println("Login is Successful."); 23 } else if ("PU".equals(select)) { 24 User user = logmanager.getLoginUser(); 25 if (user != null) { 26 System.out.println("UserId : " + user.getUserid()); 27 } else { 28 System.out.println("Not login"); 29 } 30 } 31 System.out.println(); 32 } catch (Exception e) { 33 System.out.println(e.getMessage()); 34 } 35 } 36 } 37} 38 39class User { 40 private final String userid; // ユーザID 41 private final String password; // パスワード 42 43 User(String userid, String password) { 44 this.userid = userid; 45 this.password = password; 46 } 47 String getUserid() { return this.userid; } 48 boolean check(String userid, String password) { 49 return this.userid.equals(userid) && this.password.equals(password); 50 } 51} 52 53class LoginManager { 54 // ログイン中のユーザ 55 private User loginUser = null; 56 // 登録済みユーザの配列 57 private User[] userList = { 58 new User("user01", "Denshi"), 59 new User("user05", "Qazwsx"), 60 new User("user12", "PoiUytRewq"), 61 new User("user21", "ZxcVbnm") 62 }; 63 64 User getLoginUser() { 65 return loginUser; 66 } 67 void logout() { this.loginUser = null; } 68 void login(String userid, String password) throws IllegalArgumentException { 69 // 引数で受け取ったユーザのID/passwordの組み合わせが 70 // 登録済みなら, ログイン成功としログイン中のユーザをセットする。 71 // 登録済みでないときは、ログイン中のユーザをnullにして 72 // ("UserId or Password Error")のエラーメッセージをセットした例外をスローする。 73 logout(); 74 for (User user : userList ) { 75 if (user.check(userid, password)) { 76 this.loginUser = user; 77 return; 78 } 79 } 80 throw new IllegalArgumentException("UserId or Password Error"); 81 } 82}

投稿2019/07/13 22:23

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問