Noticed the following exceptions in a support bundle recently where we can see that the BaseFileContent initizlization fails with a FileNotFoundException (which could be better handled I guess) but more importantly that it leaves a null reference of an InputStream that results in a NullPointerException:
2020-11-12 08:02:13.405+0000 [id=478625] WARNING c.c.j.s.a.UnfilteredFileContent#lambda$createBaseFileContent$0: Error opening file /var/jenkins_home/slow-requests/20200930-065237.799.txt
java.io.FileNotFoundException: /var/jenkins_home/slow-requests/20200930-065237.799.txt (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.cloudbees.jenkins.support.api.UnfilteredFileContent.getInputStream(UnfilteredFileContent.java:85)
at com.cloudbees.jenkins.support.api.UnfilteredFileContent.lambda$createBaseFileContent$0(UnfilteredFileContent.java:91)
at com.cloudbees.jenkins.support.api.BaseFileContent.writeTo(BaseFileContent.java:77)
at com.cloudbees.jenkins.support.api.UnfilteredFileContent.writeTo(UnfilteredFileContent.java:71)
at com.cloudbees.jenkins.support.SupportPlugin.writeBundle(SupportPlugin.java:351)
at com.cloudbees.jenkins.support.SupportPlugin.writeBundle(SupportPlugin.java:298)
at com.cloudbees.jenkins.plugins.advisor.BundleUpload.generateBundle(BundleUpload.java:94)
at com.cloudbees.jenkins.plugins.advisor.BundleUpload.execute(BundleUpload.java:72)
at hudson.model.AsyncPeriodicWork.lambda$doRun$0(AsyncPeriodicWork.java:100)
at java.lang.Thread.run(Thread.java:748)
2020-11-12 08:02:13.408+0000 [id=478625] WARNING c.c.j.support.SupportPlugin#writeBundle: Could not attach ''slow-requests/20200930-065237.799.txt'' to support bundle
java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at com.cloudbees.jenkins.support.api.BaseFileContent$TruncatedInputStream.read(BaseFileContent.java:205)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2314)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2270)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2291)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2246)
at com.cloudbees.jenkins.support.api.BaseFileContent.writeTo(BaseFileContent.java:81)
at com.cloudbees.jenkins.support.api.UnfilteredFileContent.writeTo(UnfilteredFileContent.java:71)
at com.cloudbees.jenkins.support.SupportPlugin.writeBundle(SupportPlugin.java:351)
at com.cloudbees.jenkins.support.SupportPlugin.writeBundle(SupportPlugin.java:298)
at com.cloudbees.jenkins.plugins.advisor.BundleUpload.generateBundle(BundleUpload.java:94)
at com.cloudbees.jenkins.plugins.advisor.BundleUpload.execute(BundleUpload.java:72)
at hudson.model.AsyncPeriodicWork.lambda$doRun$0(AsyncPeriodicWork.java:100)
at java.lang.Thread.run(Thread.java:748)
This NPE can definitely be avoided. If we know that a file could not be found, there is no point trying to copy anything.