Java Код никогда не входит в блок try в try-catch - PullRequest
0 голосов
/ 28 марта 2020

В настоящее время я создаю проект для написания клиента и сервиса, которые предоставляют информацию из базы данных musi c.

Я создал MusicService. java файл, который развертывается нормально. Однако я не уверен, что код правильный. Затем мне нужно было создать клиента. Когда я запускаю клиент, я продолжаю получать сообщения об ошибках, возникающие из-за попытки перехвата в моем MusicService. Класс java, говорящий («Невозможно найти composer») или («Невозможно найти дис c») c отладка, я знаю, что методы try в getBy Composer и getByDis c никогда не вводятся и идут прямо к улову.

Я также знаю в своем клиенте. java метод, что вводится попытка из-за того, что мой оператор печати возвращается в консоли. Однако код никогда не выполняется и сразу переходит к исключению catch, и я не могу понять, почему.

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

Я оставлю 2 метода внизу, если кто-нибудь сможет помочь, это будет с благодарностью.

MusicService. java метод

package music;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MusicService extends MusicServiceSkeleton {

 private final static String databaseHost = "mysql0.cs.stir.ac.uk";
 private final static String databaseName = "CSCU9YW";
 private final static String databasePassword = "rtk1";
 private final static String databaseUser = "rtk1";
 private final static String discTable = "music";


//define methods to implement the WSDL opeartions getByComposer() and getByDisc()

 public music.MultipleTracks getByComposer(music.Composer composer)throws ErrorFault
 {
     try {
         TrackDetail[]info=getByField("composer",composer.getComposer());
         MultipleTracks multiTrack = new MultipleTracks(); 
         TrackDetails multiRetrieve = new TrackDetails(); 
         multiRetrieve.setTracklist(info);
         multiTrack.setMultipleTracks(multiRetrieve);
         return multiTrack;
     }
     catch(Exception e)
     {
         throw(new ErrorFault("Unable to find composer"));
     }
 }

 public music.MultipleTracks getByDisc(music.Disc disc)throws ErrorFault
 {
     try {
         System.out.println("hello in getbbydisc");
         TrackDetail[]info=getByField("disc",disc.getDisc());
         MultipleTracks multiTrack = new MultipleTracks(); 
         TrackDetails multiRetrieve = new TrackDetails(); 
         multiRetrieve.setTracklist(info);
         multiTrack.setMultipleTracks(multiRetrieve);
         return multiTrack;
     }
     catch(Exception e)
     {
         throw(new ErrorFault("Unable to find disc"));
     }
 }



    private TrackDetail[] getByField(String field, String value) throws ErrorFault {
        try {
            if (value.length() == 0)
                throw (new Exception(field + " is empty"));
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            String databaseDesignation = "jdbc:mysql://" + databaseHost + "/" + databaseName + "?user=" + databaseUser
                    + "&password=" + databasePassword;
            Connection connection = DriverManager.getConnection(databaseDesignation);
            Statement statement = connection.createStatement();
            String query = "SELECT disc, track, composer, work, title " + "FROM " + discTable + " " + "WHERE " + field
                    + " LIKE '%" + value + "%'";
            ResultSet result = statement.executeQuery(query);
            result.last();
            int resultCount = result.getRow();
            if (resultCount == 0)
                throw (new Exception(field + " '" + value + "' not found"));

            TrackDetail[] trackDetails = new TrackDetail[resultCount];
            result.beforeFirst();
            int resultIndex = 0;
            while (result.next()) {
                TrackDetail receiver = detailsReceived(result);
                trackDetails[resultIndex++]= receiver;
            }
            connection.close();
            return (trackDetails);
        } catch (Exception exception) {
            String errorMessage = "database access error - " + exception.getMessage();
            throw (new ErrorFault(errorMessage, exception));
        }
    }
    private TrackDetail detailsReceived(ResultSet current)throws SQLException
    {
    TrackDetail details = new TrackDetail();
    details.setDiscNumber(current.getString(1));
    details.setTrackNumber(current.getString(2));
    details.setComposerName(current.getString(3));
    details.setWorkName(current.getString(4));
    details.setTitleName(current.getString(5));

    return details;
    }

}


Клиент. java метод


package music;

import music.MusicServiceStub.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Client extends JFrame implements ActionListener {
    private final static int contentInset = 5;
    private final static int trackColumns = 130;
    private final static int trackRows = 20;
    private final static int gridLeft = GridBagConstraints.WEST;
    private final static String programTitle = "Music Album";

    private GridBagConstraints contentConstraints = new GridBagConstraints();
    private GridBagLayout contentLayout = new GridBagLayout();
    private Container contentPane = getContentPane();
    private JButton discButton = new JButton("Check");
    private JLabel discLabel = new JLabel("Disc Number:");
    private JTextField discText = new JTextField(5);
    private JButton nameButton = new JButton("Check");
    private JLabel nameLabel = new JLabel("Composer/Artiste Name:");
    private JTextField nameText = new JTextField(16);
    private Font trackFont = new Font(Font.MONOSPACED, Font.PLAIN, 12);
    private JLabel trackLabel = new JLabel("Tracks:");
    private JTextArea trackArea = new JTextArea(trackRows, trackColumns);
    private JScrollPane trackScroller = new JScrollPane(trackArea);
    private MultipleTracks tracks;


// define here private variable for your Client Stub


    public Client() throws Exception  {
        contentPane.setLayout(contentLayout);
        addComponent(0, 0, gridLeft, nameLabel);
        addComponent(1, 0, gridLeft, nameText);
        addComponent(2, 0, gridLeft, nameButton);
        addComponent(0, 1, gridLeft, discLabel);
        addComponent(1, 1, gridLeft, discText);
        addComponent(2, 1, gridLeft, discButton);
        addComponent(0, 2, gridLeft, trackLabel);
        addComponent(0, 3, gridLeft, trackScroller);
        nameButton.addActionListener(this);
        discButton.addActionListener(this);
        trackArea.setFont(trackFont);
        trackArea.setEditable(false);

// instantiate your Client Stub and assign to private class variable declared above

}

    public static void main(String[] args) throws Exception {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int screenWidth = screenSize.width;
        int screenHeight = screenSize.height;

        Client window = new Client();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setTitle(programTitle);
        window.pack();
        int windowWidth = window.getWidth();
        int windowHeight = window.getHeight();
        int windowX = (screenWidth - windowWidth) / 2;
        int windowY = (screenHeight - windowHeight) / 2;
        window.setLocation(windowX, windowY);
        window.setVisible(true);
    }

    private void addComponent(int x, int y, int position, JComponent component) {
        Insets contentInsets = new Insets(contentInset, contentInset, contentInset, contentInset);
        contentConstraints.gridx = x;
        contentConstraints.gridy = y;
        contentConstraints.anchor = position;
        contentConstraints.insets = contentInsets;
        if (component == trackArea || component == trackLabel)
            contentConstraints.gridwidth = GridBagConstraints.REMAINDER;
        contentLayout.setConstraints(component, contentConstraints);
        contentPane.add(component);
    }

    public void actionPerformed(ActionEvent event) {
        String trackRows = "";
        TrackDetail[] tracks;
        try {
            //System.out.println("Hello");
            if (event.getSource() == nameButton)
                tracks = getField("composer", nameText.getText());
            else if (event.getSource() == discButton)
                tracks = getField("disc", discText.getText());
            else
                return;
            trackRows += String.format("%4s %5s %-32s %-40s %-40s\n", "Disc", "Track", "Composer/Artist", "Work", "Title");
            for (int i = 0; i < tracks.length; i++) {
                TrackDetail trackDetail = tracks[i];
                trackRows += extractMusicData(trackDetail);


// extract the data for a track and append to trackRows variable


            }
        } catch (Exception exception) {
            String error = exception.getMessage();
            if (error == null) error = exception.toString();
            error = "could not get track - " + error;
            trackRows += error;
        }
        trackArea.setText(trackRows);
    }

    private String extractMusicData(TrackDetail track )
    {
        String albumName= track.getWorkName();
        String composer = track.getComposerName();
        String title= track.getTitleName();
        String trackNo= track.getTrackNumber().toString();
        String discNo= track.getDiscNumber().toString();

        String extractMusicTracks= String.format("%4s %5s %-32s %-40s %-40s\n", discNo, trackNo, composer, albumName, title);
        return extractMusicTracks; 
    } 

    private TrackDetail[] getField(String field, String value) throws Exception {

// define behaviour for method getField() to call the web service methods and receive the results
    try 
    {
        TrackDetail[] multiTrack; 
        MusicServiceStub stub=new MusicServiceStub();

        if(field.equals("disc"))
        {
            MusicServiceStub.Disc requestDisc = new MusicServiceStub.Disc(); 
            requestDisc.setDisc(value);
            MusicServiceStub.MultipleTracks message= stub.getByDisc(requestDisc); 
            multiTrack= extractedTracks(message);
            return multiTrack; 
        } else if(field.equals("composer"));
        {
            MusicServiceStub.Composer requestComposer = new MusicServiceStub.Composer(); 
            requestComposer.setComposer(value);
            MusicServiceStub.MultipleTracks message= stub.getByComposer(requestComposer); 
            multiTrack= extractedTracks(message);
            return multiTrack; 
        }
    } catch(Exception e)
    {
        System.out.println(e);
    }
return null; 
    }


    private TrackDetail[] extractedTracks(MultipleTracks tracks)
    {
        TrackDetails track= tracks.getMultipleTracks();
        TrackDetail[] multiTrack= track.getTracklist(); 
        return multiTrack;
    }
    }



1 Ответ

0 голосов
/ 28 марта 2020

Ваша обработка ошибок слишком далека:

  1. Idiomati c java требует, чтобы исключения заканчивались словом «Exception». Не используйте имя «ErrorFault». Помимо не-идиоматизма c, это тавтология.

  2. При повторном броске передайте причину и потеряйте парены: throw new ErrorFault("Unable to find composer", e);, за исключением того, что не называйте ее ErrorFault. Теперь вы можете проверить, что вызывает java, чтобы перейти к блоку перехвата.

Обратите внимание, что java не переходит случайным образом, чтобы перехватить блоки без причины. Что-то в этом блоке try выбрасывает, а вы скрываете причину, выбрасывая что-то еще, не передавая оригинал как причину.

Никогда не перехватывайте исключения и просто выполняйте 'System.out.println (e)' - после этого код продолжится, даже если процесс явно находится в недопустимом состоянии. Если вы не знаете, как обрабатывать исключение, лучше всего добавить в метод предложение «throws», чтобы бросать его вперед. Если это просто не вариант, и вам также не хочется включать его в соответствующее исключение, абсолютный резерв будет throw new RuntimeException(e), а не e.printStackTrace() или, что еще хуже, уничтожающий информацию System.out.println(e); - обновите свой Шаблоны IDE!

Как только вы примените приведенный выше совет, проблема должна быть устранена. Если это не так, по крайней мере теперь вы получаете трассировку стека, которая включает в себя гораздо больше деталей; опубликуйте это как вопрос здесь (или обновите свой вопрос) с этой информацией, и, возможно, кто-то может помочь вам выяснить, что происходит.

...