2009-08-31 11 views
0

質問:コマンドライン引数から既存のテキストファイルのリストを受け入れ、 "Master.txt"内のすべてのファイルの内容を連結するJavaプログラムを作成します。 。コマンドライン引数から既存のテキストファイルのリストを受け取るJavaプログラム

私のコードは、4 endsWith(".txt")のテスト中にエラーが発生します。それを修正する方法を教えてください。

import java.io.*; 
class FileConcat 
{ 
public static void main(String[] args) 
{ 
    FileOutputStream fout; 
    FileInputStream fin,fin1; 
    File f; 
    int b; 
    try 
    { 
    //open Master file 
    try 
    { 
    fout=new FileOutputStream("Master.txt"); 
    } 
    catch(Exception e) 
    { 
    System.out.print(e.getMessage()); 
    } 
    //traverse all args, check if valid text file, if yes, concatinate 
    for(int j=0;j<args.length;j++) 
    { 
    f=new File(args[j]); 
    if(f.isFile()==true) 
    { 
    if((args[j].endsWith(".txt"))==true) 
    { 
     try 
     { 
     fin=new FileInputStream(args[j]); 
     } 
     catch(Exception e) 
     { 
     System.out.print("Error Opening "+args[j]); 
     } 
     while((b=fin.read())!=-1) 
     { 
     char ch=(char) b; 
     fout.write(ch); 
     } 
    } 
    fin.close(); 
    } 
    } 
    fout.close(); 
    fin1=new FileInputStream("Master.txt"); 
    while((b=fin1.read())!=-1) 
    { 
    char ch=(char) b; 
    System.out.print(ch); 
    } 
    fin1.close(); 
    } 
    catch(Exception e) 
    { 
    System.out.println(e.getMessage()); 
    } 
} 
} 

出力:finが値を割り当てられたりしていない場合

C:\j2sdk1.4.1_01\bin>javac FileConcat.java 
FileConcat.java:38: variable fin might not have been initialized 
               while((b=fin.read())!=-1) 
                 ^
FileConcat.java:41: variable fout might not have been initialized 
                 fout.write(ch); 
                 ^
FileConcat.java:44: variable fin might not have been initialized 
           fin.close(); 
           ^
FileConcat.java:47: variable fout might not have been initialized 
         fout.close(); 
         ^
4 errors 

はどのようにチェックしますか?

答えて

0
import java.io.BufferedWriter; <br> 
import java.io.File;<br> 
import java.io.FileWriter;<br> 
import java.util.Scanner;<br> 

public class ConcatFiles 
{ 
    public static String masterFile; 


public static void main(String[] args) throws Exception 
{ 
    MasterFile(); 
} 

public static void MasterFile() throws Exception 
{ 
    System.out.println("Enter Master File Name:"); 
    Scanner readMasterFileName = new Scanner(System.in); 
    masterFile = readMasterFileName.next(); 
    if (new File(masterFile).exists() && masterFile.contains(".txt")) 
    readFileName(); 
    else 
    { 
     if (masterFile.contains(".txt")) 
     { 
      new File(masterFile).createNewFile(); 
      System.out.println("Master File Created"); 
      readFileName(); 
     } 
     else 
     { 
      System.out.println("Invalid File or Input"); 
      MasterFile(); 
     } 
    } 
} 
public static void readFileName() throws Exception 
{ 
    System.out.println("Enter File Names:"); 
    Scanner readOtherFiles = new Scanner(System.in); 
    String cmd = readOtherFiles.next(); 

    if (cmd.equalsIgnoreCase("Exit")) 
     System.exit(0); 
    else 
     if (cmd.equalsIgnoreCase("New")) 
      MasterFile(); 
     else 
      if (cmd.contains(".txt") && new File(cmd).exists()) 
      concatFile(cmd); 
      else 
      { 
       System.out.println("Invalid Input or File"); 
       readFileName(); 
      } 
} 
public static void concatFile(String otherFiles)throws Exception 
{ 
    BufferedWriter out = new BufferedWriter(new FileWriter(masterFile, true)); 
    File readFiles = new File(otherFiles); 
    Scanner reader = new Scanner(readFiles); 
    while(reader.hasNext()) 
    { 
     out.write(reader.nextLine()+"\n"); 
    } 
    out.close(); 
    readFileName(); 
} 
} 
0

fout = new FileOutputStream("Master.txt");が例外をスローした場合、foutは未定義ですが、依然としてファイルに書き込もうとしています。

同様にfin = new FileInputStream(args[j]);が例外をスローした場合、finは未定義ですが、ファイルからの読み取りを試みます。

ループ全体をtryブロックに囲むか、mainIOExceptionをスローすると宣言できます。

私もclose()finallyにブロックへの呼び出しを移動すると例外がスローされた場合に冗長"==true" from some of the tests.

import java.io.*; 
public class FileConcat 
{ 
    public static void main(String[] args) 
    { 
    FileOutputStream fout; 
    FileInputStream fin,fin1; 
    File f; 
    int b; 

    //open Master file 
    try 
    { 
     fout=new FileOutputStream("Master.txt"); 
     try 
     { 
     //traverse all args, check if valid text file, if yes, concatinate 
     for(int j=0;j<args.length;j++) 
     { 
      f=new File(args[j]); 
      if(f.isFile()) 
      { 
      if(args[j].endsWith(".txt")) 
      { 
       try 
       { 
       fin=new FileInputStream(args[j]); 
       try 
       { 
        while((b=fin.read())!=-1) 
        { 
        char ch=(char) b; 
        fout.write(ch); 
        } 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
       finally 
       { 
        fin.close(); 
       } 
       } 
       catch(Exception e) 
       { 
       System.err.println("Error opening "+args[j]+" for input"); 
       } 
      } 
      } 
     } 
     } 
     finally 
     { 
     fout.close(); 
     } 
     fin1=new FileInputStream("Master.txt"); 
     while((b=fin1.read())!=-1) 
     { 
     char ch=(char) b; 
     System.out.print(ch); 
     } 
     fin1.close(); 
    } 
    catch(Exception e) 
    { 
     System.err.println("Error opening Master.txt for output"); 
    } 
    } 
} 
0

To answer your question at its face value, you can check if fin is assigned a value using

if (null == fin) 

The actual cause, though, is because you're continuing execution if an exception is thrown.

try 
    { 
    fin=new FileInputStream(args[j]); 
    } 
    catch(Exception e) 
    { 
    System.out.print("Error Opening "+args[j]); 
    } 

The above block doesn't set finの除去をお勧めします、まだあなたは非常に次の行にfinにアクセスします。これはfoutfin1にも適用されます。

tryブロックに他のコードをネストすることができます。アクセスするときに例外をスローする可能性のあるリソースを使用している場合は、実際にはこれが推奨されます。

+0

これは、finとfoutもnullに初期化されている場合にのみ機能します。 – finnw

1

あなたの問題は、次のセクション(および他の類似のもの)である:

try 
{ 
    fin=new FileInputStream(args[j]); 
} 
catch(Exception e) 
{ 
    System.out.print("Error Opening "+args[j]); 
} 

例外がスローされた場合には、finが値で初期化されていません。ただし、例外がスローされた場合は、おそらくプログラムを続行できません。したがって、私はtry/catchを削除し、あなたのmainメソッドthrows IOExceptionを宣言するだけでよいと思います。

0

ちょうどあなたの方法の先頭に変数を設定します。

public static void main(String[] args) { 
    FileOutputStream fout = null; 
    FileInputStream fin = null; 
    FileInputStream fin1 = null; 
    ... 
0

は、このように変数を初期化します。

FileOutputStream fout = null; 
FileInputStream fin = null, fin1 = null; 
5

問題は、あなたがフィンするすべてで何かを割り当てて、FOUTないということです宣言すると、try {}ブロック内でのみそれらに割り当てられ、その後それらを使用するコードはtry {}ブロックの外にあります。そのため、try {}ブロック内に例外がスローされた場合でも、プログラムは関係なく処理を継続し、初期化されていない値を使用しようとします。

あなたのオプションは以下のとおりです。

    がそれらを宣言するとき、彼らはこれらの変数に
  • 割り当てnullを初期化しているのtry {}ブロック内でこれらの変数を使用しようとしているコードを移動し、しようとするコードを配置し
  • if (variable != null) {}ブロックでそれらを使用します。
  • catch()句は、初期化されていない変数を使用しようとするコードが実行されないことを保証するアクションを実行します。ただ、してみてください... catch節を取り除くプログラム
  • を終了し、これらの例外
+0

答えには関係ありませんが、私はあなたの名前でCat Stevensのリファレンスが好きです(あるいは、PS238のリファレンス) – aperkins

2

言うする必要はありませんを投げると、全体メソッドを宣言:

if (b == true) 

bは、いくつかのbooleanです。これは同等です:

if (b) 

これは、あなたがcatchブロックでreturn文を追加し、あなたの質問に答えていない(他の人がすでに持っているように)とにかく

0

あなたのための役に立つかもしれません...残り.... 結構です。例:

試し{

} キャッチ(ExcepttionName exObject) { ステートメント。 リターン;

すべてのcatch()ブロックにリターンを追加する必要があります。

関連する問題