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

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

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

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

Q&A

解決済

1回答

2192閲覧

ファイル一覧を取得しようとしたら実行時エラーがでる

keita135

総合スコア16

Java

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

0グッド

0クリップ

投稿2018/05/24 10:50

編集2018/05/24 11:27

前提・実現したいこと

javaでチュートリアルを実行するかのプログラムを作っている途中で思った通りに作動していないことに気がつきました。
このプログラムで、
1,チュートリアルを実行しますかと聞いて、
2,Yesと答えると実行しますと言い、Noと答えると実行しないと言い、それ以外はerrorと表示します。(まだチュートリアルは実装していないのでチュートリアルは実行されません)
3,コマンドの入力に移ります。今のところlistを試しに実装しています。
4,listを入力すると/data/plugin/の中の拡張子がclassのファイルを一覧で示します。
しかし、4でlistと答えても結果はいつも何も起こらないという思わぬ事態が発生しました。
(/data/plugin/の中に拡張子がclassのファイルはしっかり置きました)

発生している問題・エラーメッセージ

上の通りです。4で問題が発生します。

該当のソースコード

java

1import java.io.File; 2import java.io.BufferedReader; 3import java.io.InputStreamReader; 4import java.io.IOException; 5import java.io.FilenameFilter; 6 7public class APstation11{ 8 public static void main(String []args){ 9 System.out.println("APstationにようこそ"); 10 if(!(checkFile())){ 11 System.out.println("チュートリアルの実行をしますか?(Yes or No)"); 12 String str = reader(); 13 if(str.equals("Yes")){ 14 System.out.println("チュートリアルを実行します"); 15 } 16 else if(str.equals("No")){ 17 System.out.println("チュートリアルは実行しません"); 18 } 19 else if(str.equals("error")){ 20 System.out.println("予期せぬエラー"); 21 } 22 else{ 23 System.out.println("YesかNoを入力してください"); 24 } 25 } 26 for(int i = 0;i < 10000;i++){ 27 System.out.println("何をしますか?"); 28 System.out.println("コマンドを入力してください。"); 29 System.out.println("例: list = 実行可能プログラム一覧 , settings = 各種設定 , exit = 終了 その他のコマンドはhelpと入力。"); 30 String str2 = reader(); 31 command(str2); 32 } 33 } 34 public static void command(String a){ 35 if(a.equals("help")){ 36 } 37 if(a.equals("list")){ 38 FilenameFilter filter = new FilenameFilter() { 39 40 public boolean accept(File file, String str){ 41 42 // 拡張子を指定する 43 if (str.endsWith("class")){ 44 return true; 45 }else{ 46 return false; 47 } 48 } 49 }; 50 File[] files = new File("/data/plugin/").listFiles(filter); 51 for(int i = 0;i < files.length;i++){ 52 System.out.println(files[i]); 53 } 54 } 55 if(a.equals("sttings")){ 56 } 57 if(a.equals("exit")){ 58 } 59 if(a.equals("a")){ 60 } 61 } 62 public static boolean checkFile(){ 63 File file = new File("/data/save/cho.txt"); 64 if(file.exists()){ 65 return true; 66 } 67 else{ 68 return false; 69 } 70 } 71 public static String reader(){ 72 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 73 String a = "a"; 74 try{ 75 a = br.readLine(); 76 } 77 catch(IOException e){ 78 a = "error"; 79 } 80 return a; 81 } 82}

試したこと

/data/plugin/の中に拡張子がclassのファイルをいくつか置いた

補足情報(FW/ツールのバージョンなど)

バージョンは9.0.1

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

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

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

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

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

mather

2018/05/24 11:04

後々のために書いておきますが、「javaのプログラムが思った通りに動きません」というタイトルだけみて何を質問しようとしているか読み取れません。「ファイル一覧を取得して表示しようとしたが何も出力されない」など具体的なことを書きましょう。
guest

回答1

0

ベストアンサー

「何も起こらない」とのことですが、

java

1File[] files = new File("/data/plugin/").listFiles(filter);

の後、 files に対する処理が何も実装されていませんので、これでは何も起こりようがありません。
「拡張子がclassのファイルを一覧で示します」の実装を書いてみてください。

投稿2018/05/24 10:57

mather

総合スコア6753

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

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

keita135

2018/05/24 10:59

すみませんそのことに気づいて訂正しました。訂正後のプログラムだと実行時エラーが発生します。
mather

2018/05/24 11:01 編集

その実行時エラーも記載してください。あと、全角空白になってますよ。
keita135

2018/05/24 11:06

java.lang.NullPointerExceptionです。全角空白はすみませんがどこがですか。 (いろいろと訂正の繰り返しですみません)
keita135

2018/05/24 11:07 編集

全角空白の場所分かりました訂正しておきます
mather

2018/05/24 11:08

全角空白は File[] files = new File("/data/plugin/").listFiles(filter); の行の前の空白です。 実行時エラーを記載するときは、例外の名前だけでなく、コンソールに出てくるすべての項目をそのままコピーしてください。 どの行の何文字目でエラーが出たかなどの情報が具体的に出ているはずです。
keita135

2018/05/24 11:16

Exception in thread "main" java.lang.NullPointerException at APstation12.command(APstation12.java:51) at APstation12.main(APstation12.java:31) コピペできなかったので手打ちで間違いの可能性があります。
mather

2018/05/24 11:27

APstation12.java:51 ということは51行目でエラーが発生しています。 貼り付けられたソースコードが空行も含めて一致していれば、 おそらく files.length で起こっているはずで、 files が null なんでしょうね。 JavaのAPIドキュメントを見ると、 listFilesメソッドについて「この抽象パス名がディレクトリを示さない場合、または入出力エラーが発生した場合は null を返す。」とあります。 "/data/plugin/" という文字列が表すパスををよーく考えてみましょう。なにかおかしいことに気づきませんか?
keita135

2018/05/24 11:38 編集

nullはfiles[0]に返されるのですかそれともfilterですか
mather

2018/05/24 11:44

files です。 つまり、File[] という型で宣言されていますが、実際の値は配列なのではなくfilesそのものがnullなんです。
keita135

2018/05/24 11:45

/data/plugin/をdata/plugin/にしたらできました!!!
mather

2018/05/24 11:47

ぜひ何がどう間違っていたか、どう考えるべきだったか、というのもここに記載しておくと良いです。
keita135

2018/05/24 11:54

いろいろ直してみてlistのif文の中を FilenameFilter filter = new FilenameFilter() { public boolean accept(File file, String str){ // 拡張子を指定する if (str.endsWith("class")){ return true; }else{ return false; } } }; File[] files = new File("data/plugin/").listFiles(filter); if(files == null){ System.out.println("実行可能ファイルは存在しません"); } else{ for(int i = 0;i < files.length;i++){ System.out.println(files[i]); } } にしたのですがclassファイルをdata/plugin/からなくしたときに存在しませんと出てきません。 すみませんが再度の質問にもこたえてくださるとうれしいです。
keita135

2018/05/24 12:20

分かりました。files == nullでなく、files.length == 0にすればできました。 ディレクトリが存在しない場合、配列が空だというので、配列の要素の数が0ということと同じだと考えました。
mather

2018/05/24 12:23

正解です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問