想了解Java:为什么我不能在Comparator中抛出异常?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于不能在finally抛出异常的相关问题,此外,我们还将为您介绍关于JavaCom
想了解Java:为什么我不能在Comparator中抛出异常?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于不能在finally抛出异常的相关问题,此外,我们还将为您介绍关于Java Comparator.comparing 比较导致空指针异常的解决、Java Comparator.comparing比较导致空指针异常的解决、java – Tomcat无法找到我的Servlet并抛出异常,但为什么?、java – 为什么resources.getStringArray(int)会抛出异常?的新知识。
本文目录一览:- Java:为什么我不能在Comparator中抛出异常?(不能在finally抛出异常)
- Java Comparator.comparing 比较导致空指针异常的解决
- Java Comparator.comparing比较导致空指针异常的解决
- java – Tomcat无法找到我的Servlet并抛出异常,但为什么?
- java – 为什么resources.getStringArray(int)会抛出异常?
Java:为什么我不能在Comparator中抛出异常?(不能在finally抛出异常)
直接的答案是因为Comparator.compare
s接口被指定为不会引发异常。但是为什么呢?
或换句话说:我Comparator
必须依赖可以引发异常的函数。从理论上讲,这不应该发生。但是,如果发生这种情况,我希望它脱离我正在使用的整个函数Comparator
(在中Collections.sort
)。即我希望它的行为就像发生未处理的异常一样。
似乎这不可能以一种显而易见的自然方式进行(因为如果接口说它不能抛出异常,就不会)。
我该如何解决?用丑陋的try / catch并打印出异常,并希望我能识别出来?那似乎是一个非常丑陋的方式。
答案1
小编典典在这种情况下,我将抛出一个,AssertionError
因为您认为无法引发异常。不要忘记使用该initCause()
方法来传播信息(AssertionError
没有接受的构造函数Throwable
)
Java Comparator.comparing 比较导致空指针异常的解决
Java Comparator.comparing 比较导致空指针异常
1
|
Comparator.comparing(Department::getOrder)
|
原因:
1
2
3
4
5
6
7
|
public
static
<T, U
extends
Comparable<?
super
U>> Comparator<T> comparing(
Function<?
super
T, ?
extends
U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return
(Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
|
如果 keyExtractor.apply (c1),那么 keyExtractor.apply (c1).compareTo (XX) 将报空指针异常
替代方案
1
|
Comparator.comparing(Department::getOrder, Comparator.nullsFirst(Comparator.naturalOrder()))
|
替代方案好处:
1
2
3
4
5
6
7
8
9
10
|
public
static
<T, U> Comparator<T> comparing(
Function<?
super
T, ?
extends
U> keyExtractor,
Comparator<?
super
U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return
(Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}
|
会先取出 keyExtractor.apply (c1) 和 keyExtractor.apply (c2),放入比较器进行比较
而 Comparator.nullsFirst 作为比较器,会创建一个 Comparators.NullComparator 比较器
1
2
3
|
public
static
<T> Comparator<T> nullsFirst(Comparator<?
super
T> comparator) {
return
new
Comparators.NullComparator<>(
true
, comparator);
}
|
Comparators.NullComparator 比较器的 compare 接口实现中先进行空值判断处理,不为空的再进行代入比较器比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/**
* Null-friendly comparators
*/
final
static
class
NullComparator<T>
implements
Comparator<T>, Serializable {
private
static
final
long
serialVersionUID = -7569533591570686392L;
private
final
boolean
nullFirst;
// if null, non-null Ts are considered equal
private
final
Comparator<T> real;
@SuppressWarnings
(
"unchecked"
)
NullComparator(
boolean
nullFirst, Comparator<?
super
T> real) {
this
.nullFirst = nullFirst;
this
.real = (Comparator<T>) real;
}
@Override
public
int
compare(T a, T b) {
if
(a ==
null
) {
return
(b ==
null
) ?
0
: (nullFirst ? -
1
:
1
);
}
else
if
(b ==
null
) {
return
nullFirst ?
1
: -
1
;
}
else
{
return
(real ==
null
) ?
0
: real.compare(a, b);
}
}
@Override
public
Comparator<T> thenComparing(Comparator<?
super
T> other) {
Objects.requireNonNull(other);
return
new
NullComparator<>(nullFirst, real ==
null
? other : real.thenComparing(other));
}
@Override
public
Comparator<T> reversed() {
return
new
NullComparator<>(!nullFirst, real ==
null
?
null
: real.reversed());
}
}
|
Comparator 中 comparing 方法的学习
例子:
我们需要根据对象中的 name 字段进行不规则排序
排序规则为 (PPD> 政府 > 合作)
1
2
3
4
5
|
public
class
Obj {
private
String name;
private
BigDecimal price;
......
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
@Test
public
void
sort() {
List<Obj> list = Arrays.asList(
new
Obj(
"政府"
,
null
),
new
Obj(
"政府"
,
new
BigDecimal(
"1216.23"
)),
new
Obj(
"商业"
,
new
BigDecimal(
"123.23"
)),
new
Obj(
"PPD"
,
new
BigDecimal(
"123.23"
)),
new
Obj(
"合作"
,
new
BigDecimal(
"127.23"
)),
new
Obj(
null
,
new
BigDecimal(
"125.23"
)));
List<String> sortList = Arrays.asList(
"PPD"
,
"政府"
,
"合作"
);
List<Obj> result = list.stream().sorted(
//先按照name排序(模拟需求的a属性排序)
Comparator.comparing(Obj::getName,(x,y)-> {
if
(x ==
null
&& y !=
null
){
return
1
;
}
else
if
(x !=
null
&& y ==
null
){
return
-
1
;
}
else
if
(x ==
null
&& y ==
null
){
return
-
1
;
}
else
{
for
(String sort : sortList){
if
(sort.equals(x) || sort.equals(y)){
if
(x.equals(y)){
return
0
;
}
else
if
(sort.equals(x)){
return
-
1
;
}
else
{
return
1
;
}
}
}
return
0
;
}
})).collect(Collectors.toList());
System.out.println(result);
}
|
1. 实现
comparing 方法有两种实现
方法 1: 只有一个参数,参数的类型是一个函数式接口
方法 2:
问:这个方法中泛型是怎么传递的
1、list.stream () 时,获取的 stream 流已经确定了泛型了,此时返回的对象为 Stream<Obj>
2、Stream 对象的 sorted 方法,需要比较器的类型需要是 Obj.calss 或者是 Obj 的父类
3、而我们这边调用了静态方法 Comparator.comparing, 静态方法中的泛型是根据传的参数中的类型来决定的
Java Comparator.comparing比较导致空指针异常的解决
这篇文章主要介绍了Java Comparator.comparing比较导致空指针异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Java Comparator.comparing比较导致空指针异常
Comparator.comparing(Department::getorder)
原因:
public static > Comparator comparing( Function super T, ? extends U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator & Serializable) (c1, c2) -> keyExtractor.apply(c1).compareto(keyExtractor.apply(c2)); }
如果keyExtractor.apply(c1),那么keyExtractor.apply(c1).compareto(XX)将报空指针异常
替代方案
Comparator.comparing(Department::getorder, Comparator.nullsFirst(Comparator.naturalOrder()))
替代方案好处:
public static Comparator comparing( Function super T, ? extends U> keyExtractor, Comparator super U> keyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return (Comparator & Serializable) (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); }
会先取出keyExtractor.apply(c1)和keyExtractor.apply(c2),放入比较器进行比较
而Comparator.nullsFirst作为比较器,会创建一个Comparators.NullComparator比较器
public static Comparator nullsFirst(Comparator super T> comparator) { return new Comparators.NullComparator(true, comparator); }
Comparators.NullComparator比较器的compare接口实现中先进行空值判断处理,不为空的再进行代入比较器比较
/** * Null-friendly comparators */ final static class NullComparator implements Comparator, Serializable { private static final long serialVersionUID = -7569533591570686392L; private final boolean nullFirst; // if null, non-null Ts are considered equal private final Comparator real; @SuppressWarnings("unchecked") NullComparator(boolean nullFirst, Comparator super T> real) { this.nullFirst = nullFirst; this.real = (Comparator) real; } @Override public int compare(T a, T b) { if (a == null) { return (b == null) ? 0 : (nullFirst ? -1 : 1); } else if (b == null) { return nullFirst ? 1: -1; } else { return (real == null) ? 0 : real.compare(a, b); } } @Override public Comparator thenComparing(Comparator super T> other) { Objects.requireNonNull(other); return new NullComparator(nullFirst, real == null ? other : real.thenComparing(other)); } @Override public Comparator reversed() { return new NullComparator(!nullFirst, real == null ? null : real.reversed()); } }
Comparator中comparing方法的学习
例子:
我们需要根据对象中的name字段进行不规则排序
排序规则为(PPD > 政府 > 合作)
public class Obj { private String name; private BigDecimal price; ...... }
@Test public void sort() { List list = Arrays.asList( new Obj("政府", null), new Obj("政府", new BigDecimal("1216.23")), new Obj("商业", new BigDecimal("123.23")), new Obj("PPD", new BigDecimal("123.23")), new Obj("合作", new BigDecimal("127.23")), new Obj(null, new BigDecimal("125.23"))); List sortList = Arrays.asList("PPD","政府","合作"); List result = list.stream().sorted( //先按照name排序(模拟需求的a属性排序) Comparator.comparing(Obj::getName,(x,y)-> { if(x == null && y != null){ return 1; }else if(x !=null && y == null){ return -1; }else if(x == null && y == null){ return -1; } else { for(String sort : sortList){ if(sort.equals(x) || sort.equals(y)){ if(x.equals(y)){ return 0; }else if(sort.equals(x)){ return -1; }else{ return 1; } } } return 0; } })).collect(Collectors.toList()); System.out.println(result); }
1.实现
comparing方法有两种实现
方法1:只有一个参数,参数的类型是一个函数式接口
方法2:
问:这个方法中泛型是怎么传递的
1、list.stream()时,获取的stream流已经确定了泛型了,此时返回的对象为Stream
2、Stream对象的sorted方法,需要比较器的类型需要是Obj.calss或者是Obj的父类
3、而我们这边调用了静态方法Comparator.comparing,静态方法中的泛型是根据传的参数中的类型来决定的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持小编。
java – Tomcat无法找到我的Servlet并抛出异常,但为什么?
Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unkNown servlet name MyServlet at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2393) at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2373) ... 40 more Mar 4,2009 10:37:58 AM org.apache.catalina.startup.ContextConfig applicationWebConfig SEVERE: Parse error in application web.xml file at jndi:/localhost/mywebapp/WEB-INF/web.xml java.lang.IllegalArgumentException: Servlet mapping specifies an unkNown servlet name MyServlet
体面的感觉似乎找不到我的servlet.但是,servlet似乎在正确的位置. X-4545 X-4545 X-4545 X- 200 X- 200 X- 200 200 X- 200 200 X-
作为参考,这是我目前使用的web.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <description>My first web app in Java.</description> <display-name>My Web App</display-name> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> </web-app>
200新X-45旗新新新旗新新旗新新200新200旗新200旗新新旗新新旗200新新新旗新新旗2001-新新新新旗新旗新新旗旗哨旗新新旗新新旗旗在Java中,裸机Web应用程序是什么样的,我缺少哪些组件?
更新
为了绝对确定它不是某种工具,我启动了一个新的Tomcat副本,并再次尝试.一旦这样做,这开始出现在日志文件中:
SEVERE: Error deploying web application archive mywebapp.war java.lang.UnsupportedClassversionError: Bad version number in .class file (unable to load class MyServlet)
我把我的.class文件转储给MyServlet类,用-target 1.5重新包装,重新打包了.war,一切都很完美.
非常感谢你的帮助!排除故障的好教训不会伤害任何人.
解决方法
检查用于启动Tomcat的JDK版本,然后查看是否可以执行某些操作来协调与您正在使用的版本差异来编译servlet.
这应该清除你的问题.
java – 为什么resources.getStringArray(int)会抛出异常?
我打电话给
Resources resources = Resources.getSystem();
String[] networkFiles = resources.getStringArray(R.array.xmlNetworkFiles);
我知道这个资源数组存在(因为我可以用自动生成的R文件引用它)但是它继续抛出ResourceNotFoundException.
可能导致这种情况的原因以及我该怎么做才能解决这个问题?
我在其他地方使用了类似的代码来检索一个int数组,但是这个代码在我的单元测试中总是失败.
解决方法:
这是因为Resources.getSystem()返回错误的Resources对象.从文档:
Return a global shared Resources
object that provides access to only
system resources (no application
resources), and is not configured for
the current screen (can not use
dimension units, does not change based
on orientation, etc).
因此,尽管R.array.xmlNetworkFiles是应用程序的已定义资源值,但您要求的是系统资源并且未找到它.
使用getResource()(来自Activity子类)或getContext().getResources()(来自View类).
今天关于Java:为什么我不能在Comparator中抛出异常?和不能在finally抛出异常的介绍到此结束,谢谢您的阅读,有关Java Comparator.comparing 比较导致空指针异常的解决、Java Comparator.comparing比较导致空指针异常的解决、java – Tomcat无法找到我的Servlet并抛出异常,但为什么?、java – 为什么resources.getStringArray(int)会抛出异常?等更多相关知识的信息可以在本站进行查询。
本文标签: