Может кто-нибудь помочь с моими 2 проблемами с Java у меня есть. 1 это попытка поймать 2, где положить кусок кода
Вопрос
У меня есть часть кода, над которой я работаю над заданием для универа, и по правде говоря, я не очень хорош в Java, но я пробовал. Я пытаюсь заставить свою попытку поймать на работе, но, кажется, она никогда не делает то, к чему она стремится. Я думаю, что у меня неправильное исключение, но я не уверен, какое исключение использовать для решения проблемы, так как я пытаюсь остановить ввод букв и только цифры.
Последняя проблема, с которой я столкнулся, это то, что я не знаю, где разместить этот фрагмент кода:
{
while (true)
{
cancel();
}
}
Я не уверен, в какую часть он должен идти.
Любая помощь будет очень полезна.
Это мой код, извините, если он немного грязный. Кодирование
Решение
Ваш код очень многословен - большинство комментариев не нужны (даже если вас могут попросить их включить). Вместо:
minutesfromhours = 60*minutes;
//To change the hours into minutes by diving the hour by 60 for departure.
Вы можете написать:
public final static int MINUTES_PER_HOUR = 60;
//...
minutes = MINUTES_PER_HOUR * hours;
Когда вы приведете в порядок код, вам будет намного легче увидеть логику.
Другие советы
Я советую вам научиться использовать отладчик вашей IDE. здесь есть несколько отличных бесплатных обучающих видео .
С помощью отладчика вам больше не придется помещать операторы println
по всему вашему коду.
Действительно, не торопитесь.
Ваш try / catch, вероятно, работает работает
try
{
depart= Double.parseDouble(departtime);
System.out.println(depart);
}
catch (NumberFormatException e)
{
System.out.println(e.getMessage());
}
System.out.println("Time accepted");
но вы проваливаетесь на код, который затем обрабатывает ввод независимо . Вам нужно выйти из подпрограммы в своем блоке catch
и обработать допустимый ввод в блоке try
. например.
try
{
depart= Double.parseDouble(departtime);
System.out.println(depart);
System.out.println("Time accepted");
// do further processing here
}
catch (NumberFormatException e)
{
System.out.println(e.getMessage());
// exit here
}
Вот исправление. Серьезно, сначала я думал, что ты не будешь работать. Но я отформатировал его в своей IDE и просто добавил основной метод для вызова метода cancel (). Это сработало.
import javax.swing.JOptionPane;
public class Time
{
public int difference =0;
// Stores the difference of departure and arrival time.
public static void main(String args [])
{
Time obj=new Time();
while (true)
obj.cancel();
}
public Time()
{
String departtime = JOptionPane.showInputDialog("Enter Depart Time in 24 hour time:");
// Allows the user to input their departure time into a JOptionPane.
String arrivaltime = JOptionPane.showInputDialog("Enter Arrival Time in 24 hour time:");
// Allows the user to input their arrival time into a JOptionPane.
double depart = 0;
// Store the time the user first inputs as a double.
double arrival = 0;
// Store the time the user inputs secondly as a double.
int minutes = 0;
// To store the hours for departure.
int minutes2 = 0;
// To store the minutes of departure.
int totalminutesfordeparture = 0;
// To store the full time for departure as minutes.
int minutesfromhours = 0;
// To store the hours as minutes for depature
int arrivals = 0;
// To store the hours arrival.
int arrival2 = 0;
// To store the minutes for arrival.
int arrivalhoursasminutes = 0;
// To store the arrival hours as minutes.
int totalminutesforarrival = 0;
// To store the full time for departure in minutes.
int actualtimehours= 0;
// The number of hours it will take on the journey.
int actualtimeminutes=0;
// The number of minutes it will take on the journey.
// **Start of removing the decimal for time 1 and time 2**\\
{
// Doesn't work
try
{
depart= Double.parseDouble(departtime);
System.out.println(depart);
}
catch (NumberFormatException e)
{
System.out.println(e.getMessage());
}
System.out.println("Time accepted");
arrival= Double.parseDouble(arrivaltime);
int time = (int)(depart*100);
// Gets rid of the decimal point in the departure time.
System.out.println ("Time with no decimal point "+ time);
// Check the decimal is being removed.
int time2=(int)(arrival*100);
// Gets rid of the decimal point in arrival time.
System.out.println ("Time with no decimal point "+ time2);
// Check the decimal is being removed in arrival.
// **End of removing the decimal in the times**\\
// **Start of seperating the hours and minutes in departure time**\\
{
minutes2=time%100;
// To separate the minutes from the hours for departure.
minutes=time/100;
// To seperate the hours ready to change them into minutes.
System.out.println("Hours of departure "+ minutes);
// Check that the hours are seperating from the minutes for
// departure.
System.out.println("Minutes of departure "+ minutes2);
// Check that the minutes are seperating from the hour for
// departure.
arrival2=time2%100;
// To separate the minutes from the hours.
arrivals=time2/100;
// To seperate the hours ready to change them into minutes.
System.out.println("Hours of arrival "+ arrivals);
// Check that the hours are seperating from the minutes for
// arrivals.
System.out.println("Minutes of arrival "+ arrival2);
// Check that the minutes are seperating from the hour for
// arrivals.
}
// **End of seperating the hours and minutes in departure time**\\
// **Start of hours being changed to minutes and adding it all up**\\
{
minutesfromhours = 60*minutes;
// To change the hours into minutes by diving the hour by 60 for
// departure.
System.out.println("Hours into minutes "+ minutesfromhours);
// Checks that the hours are being turned into minutes for
// departure.
totalminutesfordeparture= minutesfromhours+minutes2;
// To add together the hour minutes and the minutes from the
// time to give the total time in minutes for departure.
System.out.println("Total Departure time in minutes "+ totalminutesfordeparture);
// Checks that the hours as minutes are being added up with the
// minutes of the time for departure.
arrivalhoursasminutes = 60*arrivals;
// To change the hours into minutes for arrivals by diving the
// hours by 60 for arrivals.
System.out.println("Hours into minutes for arrival "+ arrivalhoursasminutes);
// Check that it is adding up the hour minutes and the minutes
// for departure.
totalminutesforarrival= arrivalhoursasminutes+arrival2;
// To add together the hour minutes and the minutes from the
// arrivals.
System.out.println("Total arrival time in minutes "+ totalminutesforarrival);
// Check that it is adding up the hour minutes and the minutes
// for arrivals
}
// **End of hours being changed to minutes and adding up**\\
// **Start of Finding the difference in minutes**\\
{
difference=totalminutesforarrival-totalminutesfordeparture;
// Works out the difference of minutes by taking arrival time in
// minutes away from the departure time in minutes.
System.out.println("Difference "+ difference);
// Check to see that it is taking arrival from departure.
JOptionPane.showMessageDialog(null, "It will take " + difference);
}
// **End of finding the difference in minutes**\\
// **start of not working changing minutes back to hours.**\\
{
actualtimehours= difference/60;
actualtimeminutes= difference/60;
System.out.println("It will take "+ actualtimehours);
System.out.println("It will take "+ actualtimeminutes);
}
}
}
// ** Method incase cancel button is pressed **\\
public void cancel()
{
String input=JOptionPane.showInputDialog("Cancel button was pressed");
if (input==null)
{
System.exit(0);
}
}
}
Некоторые общие комментарии.
Вы должны переместить большую часть этого кода из конструктора Time () в метод main. Этот код не имеет ничего общего с созданием экземпляра объекта времени.
Ваш цикл while должен содержать все, что вы хотели бы повторить. В этом случае запрашиваем у пользователя время отправления, время прибытия и вычисляем разницу.
У вас есть дублированный код, почему бы не найти метод, чтобы попросить пользователя ввести строку времени и проанализировать ее. Что-то вроде
public class Time {
private int hours;
private int minutes;
etc...
}
// in main
while (true) {
Time departTime = askUser("depart");
Time arriveTime = askUser("arrive");
calculateDifference(departTime, arriveTime);
}
// elsewhere
public Time askUser(String name) {
String theTime = JOptionPane.showInputDialog(
String.format("Enter %s Time in 24 hour time:", name));
Time result = parseTime(theTime, name);
return result;
}
Хорошо, я понял это сейчас :) после небольшого сна и раннего утра и тщательного обдумывания.
Прежде всего, я вложил всю важную работу в методы, освобождающие мою область конструктора, как многие из вас сказали мне делать, и да, я согласен, теперь намного проще увидеть, что происходит сейчас.
Чтобы решить проблему, попробуйте поймать. Сегодня утром я понял, что помещаю это не в то место, и оно не пытается попробовать то, что я хотел, и основная строка, которую я хотел попробовать, означала, что я должен был поместить другой код в него, и выражение catch теперь заканчивается, если он попал. Мне просто нужно выяснить, как это сделать, а не заканчивать.
Чтобы решить мою другую проблему, которая была кнопкой отмены, я использовал оператор while (true) и также поместил его туда, где также была JOptionPane, так как это были единственные 2 места, где можно было нажать кнопку отмены ... Я не знать, если это правильно, так что если кто-то может сказать мне, если это так (или еще лучше, я закомментирую это в тех местах)
Итак, вот рабочий код, в нем все еще есть пара ошибок, так как мне нужно выяснить, как ограничить его до hh.mm, так как на данный момент я могу указать любое случайное время. Мне также нужно найти как обрабатывать 24 часа с 00, так как в данный момент это вообще не обрабатывается, ему также не понравится, если вы поставите 12,00 и 3,00, либо получите -9, либо что-то еще сработало опять же, речь идет об управлении 24 часами, и последняя мелочь, с которой у него что-то не так, это то, что если вы допустите ошибку, она скорее закроется, чем зациклится, и я сейчас попытаюсь разобраться.
Спасибо за помощь всем вчера вечером, вы все мне очень помогли