-2

Javaでの例外処理は初めてです。私は自分の概念をクリアしようとしていましたが、次の問題が発生しました。

これがコードです。

class Inn {
    public static void main(String... args) {
        try{
            String i="Asd";
        } catch(Exception e) {
            System.out.println(e);
        }
        //i=7;
        System.out.println(i);
    }
}

そして、ここに来ているエラーがあります。

G:\javap>javac Inn.java
Inn.java:13: error: cannot find symbol
                System.out.println(i);
                                   ^
  symbol:   variable i
  location: class Inn
1 error
4

6 に答える 6

2
try { // Block A
    String i="Asd"; 
} // End of Block A
catch(Exception e) {
    System.out.println(e);
}

System.out.println(i); // 'i' does not exist in this scope

変数iはコードブロック A内で宣言されています。これは、その内部からのみアクセスできることを意味します (スコープを制限する { 中かっこ } に注意してください)。実行フローがブロック Aを通過するとすぐに、変数iはスコープ内に存在しなくなります。

そうは言っても、これを機能させたい場合は、内部スコープのi 外で文字列を宣言する必要があります。

String i = ""; // necessary initialization, without it you'll get a
               // "variable may have not been initialized" error
try { 
    i = "Asd"; 
}
catch(Exception e) {
    System.out.println(e);
}
于 2016-01-31T09:05:58.153 に答える
1

ほとんどのプログラミング言語では、通常、スコープを変数に関連付けます。スコープとは、平たく言えば、変数を使用できるコードのセクション、または変数が表示されるコードのセクションです。

Java (または多くの OOP 言語) では、通常、さまざまなレベルのスコープがあります。

  1. クラス レベル スコープ : クラスで定義された変数。つまり、メンバ変数はクラス内のどこからでもアクセスできます (簡単にするために、 static修飾子は省略しています)。これらの変数は通常、クラスの先頭で定義されます (規則)。これらの変数は、クラス レベルのスコープ内にあるためにクラスのメソッドの外にある必要があることに注意してください。

    public class Example {
        private String a; // variable a can be accessed anywhere inside the class
    }
    
  2. メソッド レベル スコープ : メソッド内で定義された変数は、メソッド内でのみアクセスできます。メソッドが戻ると、それらの有効期間は終了します。

     private int giveMeFive(){
        int a = 5; // Scope of a is within the method
        return a; // When a is returned then there the variable a dies :(
    }
    
  3. ループ レベル スコープ : ループ内で定義する変数は、そのループと内部ループに制限されます。それらが定義されているループの外ではアクセスできません。

     public static void main(String []args){
        for(int i=0;i<10;i++){
            System.out.println(i); // Only i is accessible here but not j
            for(int j=1;j<5;j++){
                System.out.println(i+j); // Both i and j are accessible here
            }
        }
     }
    
  4. ブロック レベルのスコープ : 一般に、中括弧 { } 内にあるものはすべて、特定のスコープを定義します。Java では、通常、変数が同じ括弧のセット内またはこれらの括弧内の任意の括弧内で定義されている限り、変数にアクセスできます。

あなたの場合、try ブロック内で変数 i を定義したため、try ブロックが終了するとすぐに変数が表示されなくなり、コード内の後で println ステートメントで見つけることができませんでした。

     public static void main(String[] args){
         String i; // i defined outside the try block so it can be accessed after the try finished running
         try{
             i= "Asd"
         }catch(Exception e){
             Sytem.out.println(e);
         }
         System.out.println(i);
     }

ではごきげんよう :)

于 2016-01-31T09:45:39.047 に答える
1

変数は別のiスコープで定義されており、印刷しようとしている時点では表示されません。

書き換えは次のとおりです。

import java.io.*;
class Inn
{
    public static void main(String s[])
    {
        String i = null;
        try{
            i="Asd";
        }catch(Exception e)
        {
            System.out.println(e);
        }
        //i=7;
        System.out.println(i);
    }
}

そうすれば、変数はステートメントiと同じスコープになります。println

于 2016-01-31T09:06:58.797 に答える
0

Java はスコープ付き言語であるため、変数の可視性は、変数が定義されている場所によって異なります。

コンピュータ プログラミングでは、名前バインディングのスコープ (変数などのエンティティへの名前の関連付け) は、バインディングが有効なコンピュータ プログラムの一部です。つまり、名前を使用してエンティティを参照できます。Java はレキシカル スコープです。

Java の try catch ブロックの変数の「スコープ」に関する問題

あなたstring iは try ブロックで宣言されているため、println メソッドはそれを見つけることができません。(対象外です

于 2016-01-31T09:39:56.500 に答える
0

これは、i のスコープが try ブロック内にあるためです。

于 2016-01-31T09:06:00.863 に答える
0

変数 i は try ブロック内で定義され、try ブロック内の i のスコープを制限します。try ブロックの外側で定義する必要があります。

于 2016-01-31T09:06:03.070 に答える