Java 用jdk8处理异常
我正在用C语言处理我的异常,委托方式如下:Java 用jdk8处理异常,java,c#,Java,C#,我正在用C语言处理我的异常,委托方式如下: public void QueryIpRanges(Action<ObservableCollection<LocationRange>, Exception> callback) { try { var ranges = from e in _xml.Descendants("computer")
public void QueryIpRanges(Action<ObservableCollection<LocationRange>, Exception> callback)
{
try
{
var ranges = from e in _xml.Descendants("computer")
select new LocationRange
{
Name = e.Attribute("prefix").Value,
Addresses = new ObservableCollection<IpRange>(
from i in e.Descendants("range")
select new IpRange
{
Start = i.Element("start").Value,
End = i.Element("end").Value,
Subnet = i.Element("subnet").Value,
Gateway = i.Element("gateway").Value
})
};
callback(new ObservableCollection<LocationRange>(ranges), null);
}
catch (FormatException ex)
{
callback(null, ex);
}
catch (ArgumentNullException ex)
{
callback(null, ex);
}
}
正如您在上面看到的,我使用委托来传递异常(如果发生)。
我的问题是,在Java8中如何使用lambda实现这一点。在Java8中处理异常最干净的方法是什么 在Java中,您可以用类似的方法来实现这一点。您需要一个具有两个参数的函数接口,例如java.util.function.BiConsumer。然后它会像这样:
public void queryIpRanges(BiConsumer<ObservableCollection<LocationRange>, Exception> callback) {
try {
// ...
callback.accept(new ObservableCollection<LocationRange>(ranges), null);
}
catch (FormatException ex) {
callback.accept(null, ex);
}
catch (ArgumentNullException ex) {
callback.accept(null, ex);
}
}
public class Program {
public static void main(String[] args) {
final int[] myInt = new int[1];
tryParseInt("123", (rs, ex) -> {
if (ex == null) {
myInt[0] = rs;
} else {
ex.printStackTrace();
System.exit(1);
}
});
System.out.println("myInt = " + myInt[0]);
}
static void tryParseInt(String text, Callback<Integer, NumberFormatException> callback) {
try {
callback.publish(Integer.parseInt(text), null);
} catch (NumberFormatException ex) {
callback.publish(null, ex);
}
}
}
@FunctionalInterface
interface Callback<T, E extends Exception> {
void publish(T result, E ex);
}
这样做:
public void queryIpRanges(BiConsumer<ObservableCollection<LocationRange>, Exception> callback) {
try {
// ...
callback.accept(new ObservableCollection<LocationRange>(ranges), null);
}
catch (FormatException ex) {
callback.accept(null, ex);
}
catch (ArgumentNullException ex) {
callback.accept(null, ex);
}
}
public class Program {
public static void main(String[] args) {
final int[] myInt = new int[1];
tryParseInt("123", (rs, ex) -> {
if (ex == null) {
myInt[0] = rs;
} else {
ex.printStackTrace();
System.exit(1);
}
});
System.out.println("myInt = " + myInt[0]);
}
static void tryParseInt(String text, Callback<Integer, NumberFormatException> callback) {
try {
callback.publish(Integer.parseInt(text), null);
} catch (NumberFormatException ex) {
callback.publish(null, ex);
}
}
}
@FunctionalInterface
interface Callback<T, E extends Exception> {
void publish(T result, E ex);
}