2016-10-31 4 views
0

私はまだJavaの新機能はまだありません。私は暗号化に取り組んでいる学校の課題に取り組んでいます。私がファイルから読み込むメソッドを探していたとき、私は多くの人がtryとcatchブロックを持っているのを見た。私はこれらの使い方にあまり慣れていないので、私は自分のコードでそれらを使うのを避けたいと思っていますが、私はそれらを削除するときに、new FileReaderreader.readLine()の後にブラケットで2つの例外があります。しかし、私がそれを使うと比較的うまく動作します。誰でも何が起きているのか説明できますか?また、キャッチを使用して、私のエンコードが完了したときに例外Nullを取得しようとすると。どんな助けもありがとうございます。プログラムでtryとcatchを使用しない場合の例外が報告される

import java.io.*; 
import java.util.*; 

public class Encrypter { 

    public static void main(String[] args) { 

     File input = null; 
     if (1 < args.length) { 
      input = new File(args[1]); 
     } else { 
      System.err.println("Invalid arguments count:" + args.length); 
      System.exit(0); 
     } 
     String key = args[0]; 
     BufferedReader reader = null; 
     try { 
      int i = 0; 
      String[] inputText = new String[20]; 
      String[] encryptText = new String[20]; 
      reader = new BufferedReader(new FileReader(input)); 
      while ((inputText[i] = reader.readLine()) != null) { 
       encryptText[i] = inputText[i]; 
       System.out.println(inputText[i]); 
       ++i; 
      } 
      int hash = key.hashCode(); 
      Random random = new Random(hash); 
      String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; 
      String alphabetPerm = alphabet; 
      char temp; 
      for (int j = 0; j < 100; j++) { 
       int n1 = random.nextInt(27) + 0; 
       int n2 = random.nextInt(27) + 0; 
       char[] swapper = alphabet.toCharArray(); 
       temp = swapper[n1]; 
       swapper[n1] = swapper[n2]; 
       swapper[n2] = temp; 
       String alphaSwap = new String(swapper); 
       alphabet = alphaSwap; 
      } 
      System.out.println(alphabet); 
      for (int k = 0; k < inputText.length; k++) { 
       encryptText[k] = inputText[k].replaceAll("[^A-Za-z0-9 ]+", " "); 
       for (int j = 0; j < inputText[k].length(); j++) { 
        int index = alphabetPerm.indexOf(encryptText[k].charAt(j)); 
        encryptText[k] = alphabetSwapper(encryptText[k], alphabet, index, j); 
        System.out.println(encryptText[k]); 
       } 
      } 
     } catch (Exception e) { 
      System.err.println("Caught Exception: " + e.getMessage()); 
     } 
    } 

    public static String alphabetSwapper(String s, String alpha, int index, int value) { 
     char toSwap = s.charAt(value); 
     char[] inputChars = s.toCharArray(); 
     inputChars[value] = alpha.charAt(index); 
     String swapped = new String(inputChars); 
     return swapped; 
    } 
} 

答えて

2

あなたは例外あなたが投げられたし、どこで起こった例外情報、2つの最も便利な部分を破棄しているので、あなたが道をキャッチしないほうが良いでしょう。

代わりに例外をキャッチ、あなたはmain()

例えばのthrows句に例外を追加することができます

public static void main(String[] args) throws IOException { 
    // ... 
} 

誰もが何が起こっているかを説明できますか?

ファイルを読むときは、IOExceptionなどとなります。ファイルが存在しない場合。あなたはこの例外をキャッチしなければならないかもしれませんが、今のところ発信者にmainが出たらそれを印刷させることができます。

また

キャッチを使用して、私は私のエンコーディングが

を行っているときに、あなたがメッセージを表示せずに例外をトリガしている意味例外ヌルを取得してみてください。あなたが例外を印刷した場合、そしてそれが起こった場所(あるいはJVMがあなたのためにそれをするようにしてください)にはどこが表示されますか?

なぜこのようなことが起こるのかを判断するには、デバッガのコードをステップ実行して、各行の動作を理解できるようにすることをお勧めします。

0

貼り付けたときの主な方法は、通常、プログラムのエントリポイントであり、他のJavaコードからは呼び出されません。したがって、プログラムを終了する前にすべての例外をキャッチして処理することをお勧めします。

「ハンドル」は異なるものを意味することができます:あなたがそうであるように

  1. は、単にコンソールに例外のメッセージを印刷する(その場合には、あなたが緩ん情報ピーターLawreyは、すでに指摘したように)。
  2. stderr出力で例外に関する詳細を出力するstacktrace(e.printStackStrace())を出力します。これは、main()メソッドにキャッチされない例外が残っている場合にjavaが実行する処理です。
  3. ロガーフレームワークを使用している場合:ロガーとそのアペンダーは、すべての例外情報を任意の宛先に出力できます。
  4. アプリケーションの(プログラム的な)呼び出し元がエラー状況を処理できるように、それを処理して(1-3)、終了コード!= 0でjavaを終了します。

BTW1:私もThrowableをキャッチします。したがって、チェックされていない可能性のある例外(NullPointerException、ArrayIndexOutOfBoundsExceptionなど)もキャッチします。

BTW2(あなたのargs配列あなたもArrayIndexOutOfBoundsExceptionが覆われているだろうにアクセスする際のエラーを加えた場合)と非常に最初に試みを置く:あなたはmainメソッド内の任意のtry..catchを持っていない希望の場合Iコンパイラが(IO操作から)未処理のチェック例外が存在する可能性があることを検出できるため、コードがコンパイルされないとします。

+0

私のコードは、try/catchを使ってコンパイルするか、mainメソッドに 'throw IOException'を入れるだけです。私はこのコードが例外を引き起こすものについて興味があります。それは 'BufferedReader'やファイル操作を利用しているのでしょうか?私は前にどちらかを使う必要はなかった。 –

+0

すべての入力ストリームまたは出力ストリームは、チェックされたIOException(または派生)を主なメソッドで正式に宣言します。概念が非常に広いので、ストリームは単純なバイト列であるほとんどすべて、すなわちファイル、バイト配列、ソケット行などから読み取ることができます。これらのリソースの操作中に、スローされた例外を通して通知される多くの失敗が発生する可能性があります。 – Heri

+0

リーダーとライターは別のストリームを囲む単なるラッパーです。 Onリーダとライターでは文字列(文字シーケンス)を操作し、ストリームでは純粋なバイト配列またはバイト配列で操作します。したがって、リーダとライタで作業する場合、使用するキャラクタセットの指示が重要です(バイト配列の文字への変換を定義するために) – Heri

関連する問題