SonarQube complains: Either log or rethrow this exception - java

I am running SonarQube 5 for code quality check after integrating the code with Maven.
Sonar is complaining that I should:
Either log or rethrow this exception.
in following piece of code:
public static Date convertStringtoDate(String stringDate) {
stringDate = StringUtils.trimToNull(stringDate);
SimpleDateFormat dfm = new SimpleDateFormat("dd-MMM-yyyy");
Date date = null;
if (stringDate != null) {
try {
date = dfm.parse(stringDate);
} catch (Exception e) {
logger.info("Cannot convert String to Date: ",convertStringtoDate(e.getMessage()));
}
}
return date;
}
What am I missing here?

First of all, is this behaviour correct? Seems a bit weird that you are trying to call convertStringtoDate on the exception message as well.
Secondly, I had the same problem with Sonar recently. Seems like you need to pass the whole exception as a parameter to the logger, instead of e.getMessage() for Sonar to realize you are logging the exception.
Try this instead:
public static Date convertStringtoDate(String stringDate){
stringDate = StringUtils.trimToNull(stringDate);
SimpleDateFormat dfm = new SimpleDateFormat("dd-MMM-yyyy");
Date date = null;
if(stringDate!=null){
try {
date = dfm.parse(stringDate);
} catch (Exception e) {
logger.info("Cannot convert String to Date: ", e);
}
}
return date;
}

Related

Using getText() with LocalDate Java

I'm making a GUI in java for a todo list and i want to write a todo type object in a file. A todo object has name, description and a date that determinds this to be done. With GUI a user can add as many todo objects he wants with them be written to a file. I'm having trouble getting the date from user from a JTextField using getText() and parsing it in a LocalDate type object in order to be written in the file.
Code I'm running now:
//registration method
public void RegularObligationRegister(RegularObligations R) throws IOException {
try {
objOutObligations.writeObject(R);
JOptionPane.showMessageDialog(null, "Save Success");
System.out.println(R);
objOutObligations.flush();
} catch (FileNotFoundException ex) {
System.out.println("Error with specified file . . .");
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
//actionperformed method
#Override
public void actionPerformed(ActionEvent ae) {
.
.
.
if (ae.getSource().equals(REntryObligationSave)) {
RegularObligations R = new RegularObligations(RegularEntry_TextObligationName.getText(),
RegularEntry_TextObligationDescription.getText(),
LocalDate.parse(RegularEntry_TextObligationDeadline.getText()));
try {
this.RegularObligationRegister(R);
} catch (IOException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
RegularEntry_TextObligationName.setText(null);
RegularEntry_TextObligationDescription.setText(null);
RegularEntry_TextObligationDeadline.setText(null);
}
You need to make sure that your text must be valid LocalDate.parse() method to parse. You need to specify your text format for the LocalDate. For ex: (dd MMM uuuu). Then you should pass your text and formatter to the LocalDate.parse() method as parameter. The example below will help you to parse a String similar to : "31 Dec 2018" as a LocalDate
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM uuuu");
LocalDate.parse(RegularEntry_TextObligationDeadline.getText(),formatter));
You can check DateTimeFormatter to customize your datetype as a text DateTimeFormatter

ParseException goes directly to catch

My SimpleDateFormat keeps throwing a ParseException. I can’t get it to actually get into the try block, it just keeps going directly to my catch. Any idea what is wrong in my code?
public static String getEventDate() throws ParseException {
System.out.println("When is the date of your event? (dd/MM/yyyy)");
String date = in.nextLine();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date eventDate = null;
try {
eventDate = dateFormat.parse(date);
} catch (ParseException e) {
System.out.println("Error in date format");
}
String finalDate = dateFormat.format(eventDate);
return finalDate;
}
public static void main(String[] args) throws ParseException {
Event event = getEventInfo();
System.out.println(event);
}
public static Event getEventInfo() throws ParseException {
String eventType = getEventType();
String eventDate = getEventDate();
Event event = new Event(eventType, eventDate);
return event;
}

How to build a calendar view using data from ics file?

I am creating a PC program which is based on iCalendar format. I need to be able to get the data from a current ics file and display it as a calendar or at least something similar to calendar. I know how to get the data from ics file just don't have any idea how to easily use that data for displaying purposes.
Here is my starting code:
public void getCalendarData(File f) throws FileNotFoundException, IOException, ParserException
{
FileInputStream fin = new FileInputStream(f);
builder = new CalendarBuilder();
calendar = builder.build(fin);
}
One thing is ical4j, which is basically a utility that wraps the ICS format.
Another thing is a front end for a calendar/schedule :-)
But, lucky us, there's a nice JSF component with Primefaces, that you can use if a web interface is OK for you.
http://www.primefaces.org/showcase/ui/data/schedule.xhtml
Basically, what you need, is to just parse the data from ICS and feed the primefaces component data model (the link above has both the JSF and the managed bean example of how to use the component)
So you'd have to so something like this
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd");
#PostConstruct
private void loadIcs() {
eventModel = new DefaultScheduleModel();
CalendarBuilder builder = new CalendarBuilder();
try {
net.fortuna.ical4j.model.Calendar calendar = builder.build(this.getClass().getResourceAsStream("canada.ics"));
for (Iterator i = calendar.getComponents().iterator(); i.hasNext();) {
Component component = (Component) i.next();
//new event
Date start = SDF.parse(component.getProperty("DTSTART").getValue());
Date end = SDF.parse(component.getProperty("DTEND").getValue());
String summary = component.getProperty("SUMMARY").getValue();
eventModel.addEvent(new DefaultScheduleEvent(summary,
start, end));
System.out.println("added "+start+end+summary);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ParserException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
Not sure if you mean the actual GUI or getting the list of dates from an icalendar which is fairly complex given the RRULE properties. In ther first case, the choice is wide open (HTML, ...) in the later case there is an example here copied below :
// Reading the file and creating the calendar
CalendarBuilder builder = new CalendarBuilder();
Calendar cal = null;
try {
cal = builder.build(new FileInputStream("my.ics"));
} catch (IOException e) {
e.printStackTrace();
} catch (ParserException e) {
e.printStackTrace();
}
// Create the date range which is desired.
DateTime from = new DateTime("20100101T070000Z");
DateTime to = new DateTime("20100201T070000Z");;
Period period = new Period(from, to);
// For each VEVENT in the ICS
for (Object o : cal.getComponents("VEVENT")) {
Component c = (Component)o;
PeriodList list = c.calculateRecurrenceSet(period);
for (Object po : list) {
System.out.println((Period)po);
}
}

Cannot convert my String to Date

i was searching how to convert a string to a date, so i've found some examples on stacko. . So i used SimpleDateFormat and tried to parse but my compiler (Gradle from AndroidStudio) send me this error : Unhandled exception : java.text.ParseException.
There is my code :
public static int compareDate(String sdate1, String sdate2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd", Locale.FRANCE);
Date date1 = simpleDateFormat.parse(sdate1); // there is the error
[...]
}
Why is there an error? Someone can explain that to me?
I'm a beginner in java and i'm sorry for my bad english, and i hope someone can help me on this.
Thanks
The parse method throws a ParseException. You need to insert a catch block or your method should throw ParseException in order to get rid of the error:
public static int compareDate(String sdate1, String sdate2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd", Locale.FRANCE);
try {
Date date1 = simpleDateFormat.parse(sdate1);
} catch (ParseException e) { // Insert this block.
// TODO Auto-generated catch block
e.printStackTrace();
}
}
OR
public static int compareDate(String sdate1, String sdate2) throws ParseException{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd", Locale.FRANCE);
Date date1 = simpleDateFormat.parse(sdate1);
}

Online Java-Code analyser

Does somebody know if there is a online code analyser for java. I would like to be able to check some small pieces of code.
Ex: this method has this warning: (Null Dereference)
private XMLGregorianCalendar asXMLGregorianCalendar(Date data) {
DatatypeFactory dateformat = null;
try {
dateformat = DatatypeFactory.newInstance();
} catch (MyException e) {
///
}
if (data == null) {
return null;
} else {
GregorianCalendar gregorianCal = new GregorianCalendar();
gregorianCal.setTimeInMillis(data.getTime());
return dateformat.newXMLGregorianCalendar(gregorianCal );
}
}
My new version is :
private XMLGregorianCalendar asXMLGregorianCalendar(Date data) throws ComponentBlockingException {
if (data == null) {
return null;
}
DatatypeFactory dateformat = null;
try {
dateformat = DatatypeFactory.newInstance();
} catch (MyException e) {
////
}
GregorianCalendar gregorianCal = new GregorianCalendar();
gregorianCal.setTimeInMillis(data.getTime());
return dateformat.newXMLGregorianCalendar(gregorianCal );
}
}
I think the second way should be ok.
I am not sure about any available online code anlayzer tool but let me try to help you with your code analysis.
If due to some reason following try block hits an an exception
try {
dateformat = DatatypeFactory.newInstance();
}
then your dateformat will remain null. So the following statement
return dateformat.newXMLGregorianCalendar(gregorianCal );
is prone to null pointer exception. And hence i believe you are getting static code anlayzer error.
You have to make sure dateformat is initialized or non-null in all the case before code reaches the line where you are doing the return.
Hope it helps!

Categories