Java MalformedURLException перехватывается - PullRequest
0 голосов
/ 19 ноября 2011

программа предполагает активировать следующий URL http://www.google.com Когда выбран выход, все остальные кнопки работают нормально, но когда я нажимаю «выход», ничего не происходит.
Я также получаю:

warning: unreachable catch clause
    catch( IOException iox ) {
    ^
thrown type MalformedURLException has already been caught

Пожалуйста, помогите

import java.awt.*;
import java.lang.*;
import java.applet.*;
import java.util.Vector;
import java.io.IOException;
import java.net.*;
import java.net.MalformedURLException;
import java.applet.Applet.*;

public class Stage extends Canvas implements Runnable
{
public class Stage2 extends Applet
{

        public Stage2() {};


    }
Stage2 stage2= new Stage2();


Graphics offGraphics = null;
Image    offImage;



Thread   conductor;

Ball     balls[];
int      numBalls;
int      numBallsAllocated;

int      width;
int      height;

int      sleepy = 5;


// ----- constructor
public Stage( int width,int height )  {
this.width  = width;
this.height = height;
    setBackground( Color.black );
    numBalls = 0;
    numBallsAllocated = 10;
    balls = new Ball[numBallsAllocated];
    conductor = null;
} // end of Stage constructor



//----- methods for setting and maintaining the size of the canvas

public Dimension preferredSize() {
return( new Dimension( width,height ));
} // end of preferredSize()

public Dimension minimumSize() {
return( new Dimension( width,height ));
} // end of minimumSize()



//----- methods for the Bounce applet object to call

public void start() {
    if ( conductor == null ) {
        conductor = new Thread(this, "Stage");
        conductor.start();
    }
else {
        for ( int i = 0; i < numBalls; i++ ) {
            balls[i].start();
        }
        conductor.resume();
    }
} // end of start()

public void stop() {
    for( int i = 0; i < numBalls; i++ ) {
        balls[i].stop();
    }
    conductor.suspend();
} // end of stop()

public void addBall() {
Color color = chooseColor( numBalls );
Ball ball = new Ball( "Ball "+(numBalls+1),color,this,sleepy );
System.out.println( "here "+ball.toString() );
// enlarge ball array if necessary.
if ( numBalls == numBallsAllocated ) {
    Ball newBalls[];
    numBallsAllocated *= 2;
    newBalls = new Ball[numBallsAllocated];
    System.arraycopy( balls,0,newBalls,0,numBalls );
    balls = newBalls;

}
balls[numBalls] = ball;
numBalls++;
ball.start();

} // end of addBall()



//----- methods for conductor thread to run

public void run() {
    while ( true ) {
        repaint();
        try {
            Thread.sleep( sleepy );
        }
    catch ( InterruptedException ix ) {
            break;
        }
    }
} // end of run()

public void faster() {
if ( sleepy > 0 ) {
    sleepy--;
}
for ( int i=0; i<numBalls; i++ ) {
    balls[i].setSleepy( sleepy );
}
System.out.println( "faster... " + sleepy );
} // end of faster()

public void slower() {
sleepy++;
for ( int i=0; i<numBalls; i++ ) {
    balls[i].setSleepy( sleepy );
}
System.out.println( "slower... " + sleepy );
} // end of slower()

public void exit()
{
    try {
      URL url = new URL( "http://www.google.com" );
      stage2.getAppletContext().showDocument( url );
    }
    catch( MalformedURLException murlx ) {
    }
    catch( IOException iox ) {
    }
} // end of exit()

// we have overridden update() instead of paint() since the
// background does not need to be cleared when doing double
// buffering.
public synchronized void update( Graphics g ) {
if ( offGraphics == null ) {
    offImage = createImage( width,height );
    offGraphics = offImage.getGraphics();
}
offGraphics.setColor( getBackground() );
offGraphics.fillRect( 0,0,width,height );
for (int i = 0; i < numBalls; i++) {
    balls[i].paint( offGraphics );
}
g.drawImage( offImage, 0, 0, this );
} // end of update()



//----- private methods.

private Color chooseColor( int i ) {
    switch (i % 5) {
        case 0: return Color.white;
        case 1: return Color.red;
        case 2: return Color.blue;
        case 3: return Color.green;
        case 4: return Color.yellow;
    }
    // Not reached
    return Color.white;
} // end of chooseColor()



 } // end of Stage class

Ответы [ 3 ]

6 голосов
/ 19 ноября 2011

Относительно предупреждения: «недостижимая команда catch catch (IOException iox)» Ничто в этом блоке try не вызывает исключение IOException.Конструктор URL выдает исключение MalformedURLException, и вы его ловите.блок catch для IOException не является обязательным и не может выполняться (т. е. он недоступен).

В качестве примечания MalformedURLException расширяет IOException.

1 голос
/ 19 ноября 2011

Первый улов также перехватывает IOException, поскольку MalformedURIException является просто расширением IOException. Вы можете безопасно удалить 2-й улов и продолжить оттуда.

0 голосов
/ 19 ноября 2011

Другие адекватно объяснили причину ошибки компиляции.


Сначала я должен сделать несколько комментариев, а затем несколько советов о том, как диагностировать оставшуюся проблему:

1) Кажется, вы запускали приложение, в котором были ошибки компиляции.Некоторые IDE позволят вам сделать это, но это несколько опасная вещь.Гораздо безопаснее отключить эту опцию и запускать только код, который компилируется.

В средах IDE (в частности, Eclipse) рассматриваются методы, которые не компилируются путем генерации кода метода, который генерирует непроверенное исключение, в котором говорится, что произошла ошибка компиляции.,Если вы вызовете такой метод из основного потока, вы получите трассировку стека.Если вы вызываете его из дочернего потока, вы не сможете увидеть трассировку стека ... в зависимости от того, есть ли у потока "обработчик необработанных исключений".Я подозреваю, что это происходило здесь!

Мораль:

  • Исправьте ошибки компиляции до того, как вы запустите свой код.
  • Установите по умолчаниюобработчик uncaught исключения, так что вы получите трассировку стека для любого потока, который умирает из-за непроверенного исключения.(Это немного продвинуто для того места, где вы находитесь в данный момент, но попробуйте и запомните это на будущее.)

2) Ваш блок catch для MalformedURLException - это исключения исключения.То есть оно ловит это исключение, ничего не говоря об этом , а затем , продолжая, как будто ничего плохого не произошло .В этом случае вам необходимо знать , было ли выброшено это исключение, потому что это означает, что в вашей программе есть ошибка;т. е. неверно заданный URL-адрес.

Мораль:

  • Не подавляйте неожиданные исключения.Любое непредвиденное исключение должно быть зарегистрировано как минимум .(Также можно разрешить распространение непроверенного исключения. Если у вас есть проверенное исключение, которое вы не хотите обрабатывать в этот момент, вы можете либо объявить его в сигнатуре метода, либо заключить его в непроверенное исключение, хотя прежний подход обычно лучше.)
  • Если вы решите, что исключение составляет ожидается и не нужно сообщать, добавьте комментарий в блок catch, чтобы объяснить, что

Вот что, я думаю, вы должны сделать, чтобы двигаться вперед:

1) Исправьте ошибки компиляции.(Вы сделали это, я понимаю)

2) Добавьте некоторый код в предложение catch, чтобы (как минимум) отправить трассировку стека на консоль.

Если это не сработает, тогда:

3a) Запустите код в отладчике

или

3b) Добавьте несколько трассировок и временно добавьте catch (Throwable ex) {ex.printStackTrace();}, чтобы увидеть, есть лиВыдается какое-то другое непроверенное исключение.

Существует ряд возможных причин наблюдаемого вами "ничего не происходит", и вам необходимо выяснить, какая из возможных причин является действительной причиной.

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