Я получаю сообщение об ошибке типа, когда переменная объявляется как область действия функции - PullRequest
0 голосов
/ 12 сентября 2011

Ниже приводится некоторая функция:

        jTextField1.setEnabled(false);
        jTextField2.setEnabled(false);
        jTextField3.setEnabled(false);
        jComboBox1.setEnabled(false);
        jComboBox2.setEnabled(false);
        String samplingRate = jTextField1.getText();
        String sampleSize = jTextField2.getText();
        String channels = jTextField3.getText();
        String endian = (String)jComboBox1.getSelectedItem();
        String outputFormat = (String)jComboBox2.getSelectedItem();
        AudioFormat outputAudioFormat = new AudioFormat( Float.parseFloat(samplingRate) , Integer.parseInt(sampleSize) , Integer.parseInt(channels) , true , Boolean.parseBoolean(endian) );
        AudioInputStream newAIS;  // newAIS declared Here 
        try {
         newAIS = AudioSystem.getAudioInputStream(outputAudioFormat,  AudioSystem.getAudioInputStream(new File(originalFile) ) );
         // The above statement converts the data in the original file to the data filled by the user
        } catch( Exception exc ){
            System.out.println( exc );
          }
        String outLoc = null;
        JFileChooser saveLoc = new JFileChooser();
        int option = saveLoc.showSaveDialog(this);
        if( option == JFileChooser.APPROVE_OPTION ) 
            outLoc = saveLoc.getSelectedFile().getAbsolutePath();
        try {
        if( outputFormat == "AIFF" ) {
          AudioSystem.write(newAIS, AudioFileFormat.Type.AIFF, new File(outLoc) ); 
          // the above line gives an error saying that newAis might not have been intialized                  
        } else if( outputFormat == "WAVE") {
            AudioSystem.write(newAIS, AudioFileFormat.Type.WAVE, new File(outLoc) );
            // the above line gives an error saying that newAis might not have been intialized     
          } else if( outputFormat == "AU") {
              AudioSystem.write(newAIS, AudioFileFormat.Type.AU, new File(outLoc) );
              // the above line gives an error saying that newAis might not have been intialized     
            } else if( outputFormat == "SND") {
                AudioSystem.write(newAIS, AudioFileFormat.Type.SND, new File(outLoc) );
                // the above line gives an error saying that newAis might not have been intialized     
              }
        } catch( Exception exc ){
          }

В приведенном выше фрагменте я объявляю переменную newAIS типа AudioInputStream. (12-я инструкция от начала) В следующей инструкции переменная newAIS инициализируется. Когда я достигаю if-else переменную части, newAIS называется неинициализированной IDE и выдает ошибку, сообщающую, что newAis, возможно, не инициализирован Почему это так? Переменная newAIS имеет область действия функции.

С другой стороны, если я объявляю переменную newAIS global, IDE не обнаружит ошибку.

Почему это происходит?

Ответы [ 3 ]

1 голос
/ 12 сентября 2011

Вы инициализируете переменную в блок try.Если при инициализации возникает исключение, вы просто распечатываете его и продолжаете.Вы должны бросить исключение в этом случае.

1 голос
/ 12 сентября 2011

Да, он находится в scope , но, возможно, он не был инициализирован - если возникает исключение, тогда вместо переменной, которой присваивается значение, вы просто распечатываете исключение и продолжаете. Какое значение вы ожидаете получить newAIS в этом случае?

Локальные переменные проверяются на определенное присваивание перед чтением, но экземпляры / статические переменные - нет.

Заметьте, что если вы не продолжали использовать факт исключения, а вместо этого бросили еще одно исключение до вызывающей стороны, или просто не перехватили его в первую очередь или не вернули, было бы хорошо. Непонятно, с какими исключениями вы действительно пытаетесь справиться - ловить Exception - это вообще плохая практика.

Вы можете просто присвоить переменной значение, с которого нужно начать:

AudioInputStream newAIS = null;

... но разве вы действительно хотите продолжать работу, если назначение не выполнено?

Также обратите внимание, что вы в настоящее время сравниваете строки, используя ==, что также является плохой идеей. Это:

if (outputFormat == "AIFF")

вероятно должно быть:

if (outputFormat.equals("AIFF"))
0 голосов
/ 12 сентября 2011

Это связано с тем, что в newAIS = AudioSystem.getAudioInputStream(... может возникнуть исключение, поэтому newAIS никогда не инициализируется.

Вам следует сделать следующее:

AudioInputStream newAIS = null;  // newAIS declared Here 
try {
   newAIS = AudioSystem.getAudioInputStream(outputAudioFormat, AudioSystem.getAudioInputStream(new File(originalFile) ) );

   } catch( Exception exc ){
         // handle the exception properly not just write something out!
}

Возможно, вы захотите вернуться в подвохчтобы вы могли избежать NullPoiterException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...