Date is not being read by JFormattedTextField? Gives `java.lang.NullPointerException` - java

I am designing a staff data manager which will allow the users to add, edit and view the staff details.
In the code I have a JFormattedTextField defined as follows.
SimpleDateFormat dateDOB = new SimpleDateFormat("dd/MM/yyyy");
JFormattedTextField DOBBX = new JFormattedTextField(dateDOB);
When I want to edit the staff data, I load the date to the JFormattedTextField as follows:
DOBBX.setText(""+retrievedStaff.getDOB());
After editing if I save the data, the value for DOB is null and I get a java.lang.NullPointerException. This only happens if I leave the value for DOB unedited. If I make changes to DOB or enter it again then DOB value is correctly saved.
Also if I add a new staff and then try to edit the staff data without closing the program, the date is properly saved to the binary file with no nullpointer error.
How do I fix this?
(I have no idea how to provide an MCVE for this as my code is quite long and consists of many classes)
Before saving the date to binary file I use the following method to convert it to a string:
public String getDOB() {
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try{
String textDate = df.format((DOB));
return textDate;
}catch(Exception e){e.printStackTrace();}
return null;
}
In the StackTrace it is mentioned that the error is produced by this part of the code:
String textDate = df.format((DOB));

I solved this problem. So as I told in the question that the date is properly saved to binary file if I click or change the DOB textbox. So I set the cursor to DOB textfield when the user clicks edit button using requestFocus().

Related

Java: Formatting a Date inside of a string

I know I'm probably doing something wrong, but I am trying to format a Date that is currently stored inside of a string but it won't let me parse it to a String because it doesn't recognize it as a Date (because it's in a String variable) and won't let me format it because it cannot format it in its current state. For reference, I am making a time clock application.
I apologize if I'm doing something stupid but I am fairly new to this and have never used SimpleDateFormat before. I put some snippets of code below:
ArrayList<String> punchHistoryTimes = new ArrayList<String>();
SimpleDateFormat sdf =new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
public void updatePunchHistory(Sheet sheet){
for(int rowNum:rowNumbers){
punchHistoryTimes.add(sheet.getRow(rowNum).getCell(1).getStringCellValue());
punchHistory.add(new JLabel(sheet.getRow(rowNum).getCell(0).getRichStringCellValue().getString()+ " " + sheet.getRow(rowNum).getCell(1).getRichStringCellValue().getString()+ " " + sheet.getRow(rowNum).getCell(2).getRichStringCellValue().getString()));
}
}
//other code is above this but not relevant to the issue
currentEmployee.setEndTime(sdf.format(currentDate));
if(punchHistory.get(punchHistory.size()-1).getText().contains("Clocked In")){
calcTimeWorked(punchHistory.get(punchHistoryTimes.size()-1).getText(),currentEmployee.getEndTime());
}else{
//This line below is where the error is happening
//value of currentEmployee.getStartTime() at error: 1654653731536
//value of currentEmployee.getEndTime() at error: 07-06-2022 21:02:12
//Both currentEmployee.getStartTime() and currentEmployee.getEndTime() are stored as Strings
calcTimeWorked(currentEmployee.getStartTime(),currentEmployee.getEndTime());
}
currentEmployee.setHoursWorked(differenceInTime);
I tried using the debugger and it shows the error is that it cannot parse 1654653731536. I understand the issue but cannot get a solution. I believe the issue is because when it stores the value in the excel file it is storing the date as a string but then when it pulls the date back out of the excel later (the application would have been closed between these events) it views it as a string and does not recognize that there is a Date inside of the String. Is there any way to cast the String 1654653731536 to a Date?

generate files with unique names and write data into them

I want to write data fetched from a database table every time to new text files with different names.
I use Calendar.getInstance().getTime() to make the filename unique and create the corresponding new txt file in the required directory:
String path = "/home/username/Documents/Netbeans Projects/cashbackEngine/Reports";
Date currentTime = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmm");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateString = simpleDateFormat.format(currentTime);
String reportFileName2 = "ICC_Cashback_Report_SS_$1$.txt".replace("$1$", sdf.format(currentTime));
String reportFilePath2 = path + "/" + reportFileName2;
File file = new File(reportFilePath2);
writer = new FileWriter(file, true);
Then I iterate over the dataset and write the data to the file by using writer.write();
Is there any other simple way to do this... or any inbuilt string builder method in Java to automatically generates the new file names with constant prefix and unique suffix numbers.
I don't want to use a timestamp to distinguish it from others
and every time new data will get added to the newly generated text file whenever the Java code is executed...
You could use a simple counter as a file prefix. You'd have to persist the current state of the counter between different runs of the program, though, e.g. also in the database. Here's a question dealing with the same issue and answers containing your current approach and others.

DBunit - Unable to typecast <1997/02/14> to TimeStamp

I'm doing an integration testing with DBUnit (2.49) + Hibernate (4.1.3) following this tutorial.
Production database : Oracle 10
Test database : Hsqldb 2.3.3
Context
My data contains the current format of date : yyyy/MM/dd. However,according to DBUnit faq, DBUnit only supports this format yyyy-mm-dd hh:mm:ss.fffffffff, so I had to create a new format for TimeStamp.
How I tried to fix it
I created a CustomTimeStampDataType based on this tutorial. I changed this part:
String formats[] = {"yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm a", "yyyy-MM-dd HH:mm:ss.fffffffff"};
into this one:
String formats[] = {"yyyy/MM/dd"};
I created a CustomeDataTypeFactory following the same tutorial. I only make it extend Oracle10DataTypeFactory rather than DefaultDatatTypeFactory.
In HibernateDBUnitTestCase, I override setDatabaseConfig() with the following:
#Override
protected void setUpDatabaseConfig(DatabaseConfig config){
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new CustomDataTypeFactory());
}
But I got new errors
I ran a unit test and got this error.
org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997/02/14> of type <java.lang.String> to TIMESTAMP
at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:120)
at org.dbunit.dataset.datatype.TimestampDataType.setSqlValue(TimestampDataType.java:176)
at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
at test.PlayerTest.setUp(PlayerTest.java:117)
Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Unknown Source)
at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:116)
... 20 more
That was weird, it seemed like my CustomTimeStamp was not called, so I changed the date in the dataset using the default format : 1997-02-14 00:00:00.0, and ran the unit test again. Then I got:
org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997-02-14 00:00:00.0> of type <java.lang.String> to TIMESTAMP
at test.CustomTimestampDataType.typeCast(CustomTimestampDataType.java:69)
at test.CustomTimestampDataType.setSqlValue(CustomTimestampDataType.java:84)
at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
at test.PlayerTest.setUp(PlayerTest.java:117)
That means CustomTimeStamp was actually called. Seems like, the problem stemed from DatabaseTestCase.setUp which somehow called the wrong TimeStampDataType.
How could I fix this issue?
My first option was to replace every yyyy/MM/dd into yyyy-mm-dd in the dataset using regular expressions. This worked fine, until I had to test a method that selected a date based on a request (so the format is yyyy-mm-dd) and compared it to the current date. ( so the format is yyyy / mm / dd). Hsqldb can't compare two dates with different format.
My second option was to decompile dbunit.jar, rewrite TimeStampDataType based on the tutorial. I'm unfamiliar with bytecode writing so before entering uncharted waters, I wanted to know if you had another solution.
Thank you in advance
Fixed it!
So I ended up using my second option.
This is the detailed path for those who need it.
Download dbUnit.2.2.source.jar
Unzip the jar
Go to Eclipse, File > New > Java Project
Uncheck "Use default location"
In Location : specify the path to the new folder created from the jar
Click on Finish
Modify the TimestampDataType.java (if needed)
Instead of ts = java.sql.Timestamp.valueOf(stringValue); use the code below
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
Modify the DateDataType.java (if needed)
Instead of return java.sql.Date.valueOf(stringValue); , use the code below
String formats[] =
{"dd/MM/yyyy"}; //and more depending on your need
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
java.sql.Date datesql = new java.sql.Date(date.getTime());
return datesql;
}
catch( ParseException e) {
}
}
Right-click on your project, then Export
Select JAR file, then Next
Fill the export destination then Finish.
You just have to add this new jar to the library to make it work.

How to Insert null Values in JDate

hey guys i m suffering with a problem with NullPointerException i've a jTable wish it have values from those values one Value i put it an Empty value it's a Date this date Can Sometimes Empty means we don't have this Date and Sometimes it's full i tried to Edit this Table so when i click on the Table and click on Button Edit it's shows me a new Frame wish have a Fields to fill them , i want it to populate automaticly it's works very good exept with this empty value wish i've the problem :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
I tried this code
public void fillDateSortie(){
int row = AdminFW.TableStock.getSelectedRow();
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd");
String dateInString2 = AdminFW.TableStock.getModel().getValueAt(row, 9).toString();
try{
java.util.Date date2 = formatter2.parse(dateInString2);
DateSortieStock.setDate(date2);
}catch(Exception e ){
javax.swing.JOptionPane.showMessageDialog(null, e);
}
if(DateSortieStock.getDate()==null){
DateSortieStock.setDate(null);
}
}
Try with this .This code not will gives you a exception .
if( ((JTextField)DateSortieStock.getDateEditor().getUiComponent()).getText().equals("")){
DateSortieStock.setDate(null);
}
Hope it helps..

How to set search condition of date, to retrieve other details on that date from database?

These are the basic conditions set in my code.
t1 = new JFormattedTextField(new SimpleDateFormat("dd-MM-yyyy"));
t1.setValue(new java.util.Date());
java.util.Date searchDate=(java.util.Date)t1.getValue();
Retrieving Date from the Result Set.
Date Date1 = rs.getDate("Date1");
I wanted to know whether this condition for matching the dates i enter and for retrieving the dates from database is correct or not. I am new in the world of coding.
if(new java.sql.Date(searchDate.getTime()).equals(Date1))
{
... //code
}
Nevermind...
making it...
java.sql.Date sqlSearchdate = new java.sql.Date(searchDate.getTime());
and
if(sqlSearchdate.equals(Date1)
{
...
}
solved the problem. This was so silly. My bad for asking such a question.
Yes that should work, according to http://www.mkyong.com/java/how-to-compare-dates-in-java/ though i'm not sure why you're creating a new Date object in the if statement.

Categories

Resources